Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ДИПЛОМ1.docx
Скачиваний:
2
Добавлен:
01.07.2025
Размер:
6 Мб
Скачать
☆

Заключение

В ходе дипломной работы мной была написана (ты только писала???????????????) программа для учета услуг в фотосалоне в системе 1С предприятие. Все поставленные цели были достигнуты. Программа производит учет услуг, хранит документы и данные, необходимые для создания и учета услуг.

Так же имеется возможность расчета прибыли и автоматической наценки.

В заключение можно сказать о том, что разработка приложений не остановится на разработанном приложении (масло масляное). Ведь технологии и условия предоставления услуг не стоят на месте.

Во время написания дипломной работы, мной было получено множество теоретических и практических знаний, в области разработки автоматизированных рабочих мест, а так же в области

Список использованной литературы

  1. http://www.interface.ru

  2. М.Г. Радченко «1С: Предприятие. Практическое пособие для разработчиков» ООО «1С-Паблишинг», СПб:Питер, 2007 г.

  3. «1С: Предприятие. Руководство разработчика прикладных решений» ООО «1С-Паблишинг» Москва, Фирма «1С», 2009 г.

  4. Н.Н. Карпухина «Экономические информационные системы: Разработка прикладного решения средствами 1С: Предприятия» Учебное Пособие, М:МГУПи, 2013 г.

Тексты процедуры

Общий модуль «Работа со справочниками»

Функция РозничнаяЦена(АктуальнаяДата,ЭлементУслуги) Экспорт

//Создать вспомогательный объект Отбор.

Отбор=Новый Структура("Услуга",ЭлементУслуги);

//Получить актуальные значения ресурсов регистра.

ЗначенияРесурсов=РегистрыСведений.Цены.ПолучитьПоследнее

(АктуальнаяДата,Отбор);

Возврат ЗначенияРесурсов.Цена;

КонецФункции

Общий модуль «Длительные операции»

Функция ФормаДлительнойОперации() Экспорт

Возврат ПолучитьФорму("ОбщаяФорма.ДлительнаяОперация");

КонецФункции

Общий модуль «Работа с документами»

Процедура РассчитатьСумму(СтрокаТабличнойЧасти) Экспорт

Наценка = СтрокаТабличнойЧасти.Наценка;

Цена = СтрокаТабличнойЧасти.Цена;

Сумма = СтрокаТабличнойЧасти.Сумма;

Стоимость = СтрокаТабличнойЧасти.Стоимость;

Количество = СтрокаТабличнойЧасти.Количество;

Если Наценка = 0 Тогда

СтрокаТабличнойЧасти.Наценка = 1.2;

КонецЕсли;

Если Стоимость <> 0 Тогда

СтрокаТабличнойЧасти.Цена = СтрокаТабличнойЧасти.Стоимость * СтрокаТабличнойЧасти.Наценка;

СтрокаТабличнойЧасти.Сумма = СтрокаТабличнойЧасти.Количество * СтрокаТабличнойЧасти.Цена;

ИначеЕсли Стоимость = 0 И Цена <> 0 И Количество <> 0 Тогда

СтрокаТабличнойЧасти.Стоимость = СтрокаТабличнойЧасти.Цена /СтрокаТабличнойЧасти.Наценка;

СтрокаТабличнойЧасти.Сумма = СтрокаТабличнойЧасти.Количество * СтрокаТабличнойЧасти.Цена;

КонецЕсли;

КонецПроцедуры

Общий модуль «Проведение расчетов»

Процедура РассчитатьНачисления(НаборЗаписейРегистра,ТребуемыйВидРасчета,СписокСотрудников)Экспорт

Регистратор=НаборЗаписейРегистра.Отбор.Регистратор.Значение;

//Рассчитать первичные записи.

Если ТребуемыйВидРасчета=ПланыВидовРасчета.ОсновныеНачисления.Оклад Тогда

Запрос=Новый Запрос;

Запрос.Текст=

"Выбрать

|isnull(НачисленияДанныеГрафика.ЗначениеПериодДействия,0) КАК Норма,

|isnull(НачисленияДанныеГрафика.ЗначениеФактическийПериодДействия,0) КАК Факт,

|НачисленияДанныеГрафика.НомерСтроки КАК НомерСтроки

|ИЗ

|РегистрРасчета.Начисления.ДанныеГрафика(Регистратор=&Регистратор И

|ВидРасчета=&ВидРасчета И Сотрудник В(&СписокСотрудников))

|КАК НачисленияДанныеГрафика";

Запрос.УстановитьПараметр("Регистратор",Регистратор);

Запрос.УстановитьПараметр("ВидРасчета",ТребуемыйВидРасчета);

Запрос.УстановитьПараметр("СписокСотрудников",СписокСотрудников);

ВыборкаРезультата=Запрос.Выполнить().Выбрать();

Для Каждого ЗаписьРегистра Из НаборЗаписейРегистра Цикл

СтруктураНомер=Новый Структура("НомерСтроки");

СтруктураНомер.НомерСтроки=ЗаписьРегистра.НомерСтроки;

ВыборкаРезультата.Сбросить();

Если ВыборкаРезультата.НайтиСледующий(СтруктураНомер) Тогда

Если ВыборкаРезультата.Норма=0 Тогда

Сообщение=Новый СообщениеПользователю;

Сообщение.Текст="Вид рассчета:Оклад-Нет рабочих дней в заданном периоде";

Сообщение.Сообщить();

ЗаписьРегистра.Результат=0;

Иначе

//Рассчитать оклад по фактическому периоду и исходным данным ЗаписьРегистра.Результат=ЗаписьРегистра.ИсходныеДанные;///

ВыборкаРезультата.Норма)*ВыборкаРезультата.Факт;

Сообщение=Новый СообщениеПользователю;

Сообщение.Текст="Выполнен расчет"+ЗаписьРегистра.Регистратор+"-"+ЗаписьРегистра.ВидРасчета+"-"+ЗаписьРегистра.Сотрудник;

Сообщение.Сообщить();

КонецЕсли;

КонецЕсли;

КонецЦикла;

//Рассчитать вторичные записи

ИначеЕсли ТребуемыйВидРасчета=ПланыВидовРасчета.ОсновныеНачисления.Премия Тогда

Запрос=Новый Запрос;

Запрос.Текст=

"ВЫБРАТЬ

| НачисленияБазаНачисления.НомерСтроки КАК НомерСтроки,

| НачисленияБазаНачисления.РезультатБаза КАК База

|ИЗ

| РегистрРасчета.Начисления.БазаНачисления(&ИзмеренияОсновного,&ИзмеренияБазового,,Регистратор=&Регистратор И ВидРасчета=&ВидРасчета И Сотрудник В(&СписокСотрудников))

|КАК НачисленияБазаНачисления";

Измер=Новый Массив(1);

Измер[0]="Сотрудник";

Запрос.УстановитьПараметр("ИзмеренияОсновного",Измер);

Запрос.УстановитьПараметр("ИзмеренияБазового",Измер);

Запрос.УстановитьПараметр("Регистратор",Регистратор);

Запрос.УстановитьПараметр("ВидРасчета",ТребуемыйВидРасчета);

Запрос.УстановитьПараметр("СписокСотрудников",СписокСотрудников);

ВыборкаРезультата=Запрос.Выполнить().Выбрать();

Для Каждого ЗаписьРегистра ИЗ НаборЗаписейРегистра Цикл

СтруктураНомер=Новый Структура("НомерСтроки");

СтруктураНомер.НомерСтроки=ЗаписьРегистра.НомерСтроки;

Выборкарезультата.Сбросить();

Если ВыборкаРезультата.НайтиСледующий(СтруктураНомер)Тогда

ЗаписьРегистра.Результат = ЗаписьРегистра.ИсходныеДанные;//ВыборкаРезультата.База*(10/100);

Сообщение=Новый СообщениеПользователю;

Сообщение.Текст="Выполнен расчет"+ЗаписьРегистра.Регистратор+"-"+ЗаписьРегистра.ВидРасчета+"-"+ЗаписьРегистра.Сотрудник;

Сообщение.Сообщить();

КонецЕсли;

КонецЦикла;

КонецЕсли;

КонецПроцедуры

Процедура ПерерассчитатьНачисления(ТребуемыйВидРасчета) Экспорт

// Здесь следует выбрать из набора записей перерасчета записи в следующей последовательности:

// записи документа1 для сотрудников из списка,

// записи документа2 для сотрудников из списка и т. д.

Запрос = Новый Запрос(

"ВЫБРАТЬ

| НачисленияПерерасчет.ОбъектПерерасчета,

| НачисленияПерерасчет.Сотрудник

|ИЗ

| РегистрРасчета.Начисления.Перерасчет КАК НачисленияПерерасчет

|ГДЕ

| НачисленияПерерасчет.ВидРасчета = &ТребуемыйВидРасчета

|ИТОГИ ПО

| НачисленияПерерасчет.ОбъектПерерасчета");

Запрос.УстановитьПараметр("ТребуемыйВидРасчета", ТребуемыйВидРасчета);

СписокСотрудников = Новый СписокЗначений;

// Перебрать группировку по регистратору.

ВыборкаПоРегистратору = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

Пока ВыборкаПоРегистратору.Следующий() Цикл

Регистратор = ВыборкаПоРегистратору.ОбъектПерерасчета;

// Перебрать группировку по сотрудникам для выбранного регистратора

// и создать список сотрудников.

ВыборкаПоСотрудникам = ВыборкаПоРегистратору.Выбрать();

СписокСотрудников.Очистить();

Пока ВыборкаПоСотрудникам.Следующий() Цикл

СписокСотрудников.Добавить(ВыборкаПоСотрудникам.Сотрудник);

КонецЦикла;

// Получить набор записей регистра расчета для выбранного регистратора.

НаборЗаписей = РегистрыРасчета.Начисления.СоздатьНаборЗаписей();

НаборЗаписей.Отбор.Регистратор.Значение = Регистратор;

НаборЗаписей.Прочитать();

РассчитатьНачисления(НаборЗаписей, ТребуемыйВидРасчета, СписокСотрудников);

НаборЗаписей.Записать( , Истина);

// Очистить перерассчитанные записи в перерасчете.

НаборЗаписейПерерасчета = РегистрыРасчета.Начисления.Перерасчеты.Перерасчет.СоздатьНаборЗаписей();

НаборЗаписейПерерасчета.Отбор.ОбъектПерерасчета.Значение = Регистратор;

НаборЗаписейПерерасчета.Записать();

КонецЦикла;

КонецПроцедуры

Процедура ПерерассчитатьНачисления(ТребуемыйВидРасчета) Экспорт

// Здесь следует выбрать из набора записей перерасчета записи в следующей последовательности:

// записи документа1 для сотрудников из списка,

// записи документа2 для сотрудников из списка и т. д.

Запрос = Новый Запрос(

"ВЫБРАТЬ

| НачисленияПерерасчет.ОбъектПерерасчета,

| НачисленияПерерасчет.Сотрудник

|ИЗ

| РегистрРасчета.Начисления.Перерасчет КАК НачисленияПерерасчет

|ГДЕ

| НачисленияПерерасчет.ВидРасчета = &ТребуемыйВидРасчета

|ИТОГИ ПО

| НачисленияПерерасчет.ОбъектПерерасчета");

Запрос.УстановитьПараметр("ТребуемыйВидРасчета", ТребуемыйВидРасчета);

СписокСотрудников = Новый СписокЗначений;

// Перебрать группировку по регистратору.

ВыборкаПоРегистратору = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

Пока ВыборкаПоРегистратору.Следующий() Цикл

Регистратор = ВыборкаПоРегистратору.ОбъектПерерасчета;

// Перебрать группировку по сотрудникам для выбранного регистратора

// и создать список сотрудников.

ВыборкаПоСотрудникам = ВыборкаПоРегистратору.Выбрать();

СписокСотрудников.Очистить();

Пока ВыборкаПоСотрудникам.Следующий() Цикл

СписокСотрудников.Добавить(ВыборкаПоСотрудникам.Сотрудник);

КонецЦикла;

// Получить набор записей регистра расчета для выбранного регистратора.

НаборЗаписей = РегистрыРасчета.Начисления.СоздатьНаборЗаписей();

НаборЗаписей.Отбор.Регистратор.Значение = Регистратор;

НаборЗаписей.Прочитать();

РассчитатьНачисления(НаборЗаписей, ТребуемыйВидРасчета, СписокСотрудников);

НаборЗаписей.Записать( , Истина);

// Очистить перерассчитанные записи в перерасчете.

НаборЗаписейПерерасчета = РегистрыРасчета.Начисления.Перерасчеты.Перерасчет.СоздатьНаборЗаписей();

НаборЗаписейПерерасчета.Отбор.ОбъектПерерасчета.Значение = Регистратор;

НаборЗаписейПерерасчета.Записать();

КонецЦикла;

КонецПроцедуры

Общий модуль «Журнал регистрации»

// Подсистема "Базовая функциональность".

// Внутренние процедуры и функции для работы с журналом регистрации.

// Служебный программный интерфейс

// Выполняет чтение событий журнала регистрации в соответствии с установленным отбором

// Параметры:

// ПараметрыОтчета - Структура, содержит параметры для чтения событий журнала регистрации

// АдресХранилища - Адрес временного хранилища, куда помещается итоговый результат

// Журнал - ТаблицаЗначений, содержащая записи журнала регистрации

// ОтборЖурналаНаКлиенте - Структура, настройки отбора для чтения записей журнала регистрации

// КоличествоСобытий - Число, ограничивает число считываемых событий журнала

// УникальныйИдентификатор - УникальныйИдентификатор, уникальный идентификатор формы

// МенеджерВладельца - менеджер объекта, в форме которого отображается журнал регистрации,

//необходим для обратного вызова функций оформления

// ДобавлятьДополнительныеКолонки - Булево, определяет необходимость обратного вызова для добавления дополнительных колонок

//

Процедура ПрочитатьСобытияЖурналаРегистрации(ПараметрыОтчета, АдресХранилища) Экспорт

Журнал = ПараметрыОтчета.Журнал;

ОтборЖурналаНаКлиенте = ПараметрыОтчета.ОтборЖурналаРегистрации;

КоличествоСобытий = ПараметрыОтчета.КоличествоПоказываемыхСобытий;

УникальныйИдентификатор = ПараметрыОтчета.УникальныйИдентификатор;

МенеджерВладельца = ПараметрыОтчета.МенеджерВладельца;

ДобавлятьДополнительныеКолонки = ПараметрыОтчета.ДобавлятьДополнительныеКолонки;

// Удаление ранее подготовленных временных данных

ОписанияАдресов = Журнал.ВыгрузитьКолонку("АдресДанных");

Для каждого Адрес Из ОписанияАдресов Цикл

Если ЗначениеЗаполнено(Адрес) Тогда

УдалитьИзВременногоХранилища(Адрес);

КонецЕсли;

КонецЦикла;

// Подготовка Отбора

Отбор = Новый Структура;

Для Каждого ЭлементОтбора Из ОтборЖурналаНаКлиенте Цикл

Отбор.Вставить(ЭлементОтбора.Ключ, ЭлементОтбора.Значение);

КонецЦикла;

ПреобразованиеОтбора(Отбор);

// Выгрузка отбираемых событий

СобытияЖурнала = Новый ТаблицаЗначений;

ВыгрузитьЖурналРегистрации(СобытияЖурнала, Отбор, , , КоличествоСобытий);

СобытияЖурнала.Колонки.Добавить("НомерРисунка", Новый ОписаниеТипов("Число"));

СобытияЖурнала.Колонки.Добавить("АдресДанных", Новый ОписаниеТипов("Строка"));

Если ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда

СобытияЖурнала.Колонки.Добавить("ПредставлениеРазделенияДанныхСеанса", Новый ОписаниеТипов("Строка"));

КонецЕсли;

ПравилаУстановкиРисунка = Неопределено;

Если ДобавлятьДополнительныеКолонки Тогда

// Добавление дополнительных колонок

МенеджерВладельца.ДобавитьДополнительныеКолонкиСобытия(СобытияЖурнала);

КонецЕсли;

ПроверенныеПользователи = Новый Массив();

ПсевдонимыСлужебныхПользователей = Новый Соответствие();

Для Каждого СобытиеЖурнала Из СобытияЖурнала Цикл

// Заполнение номеров картинок строк

МенеджерВладельца.УстановитьНомерРисунка(СобытиеЖурнала);

Если ДобавлятьДополнительныеКолонки Тогда

// Заполнение дополнительных полей, определенных только у владельца

МенеджерВладельца.ЗаполнитьДополнительныеКолонкиСобытия(СобытиеЖурнала);

КонецЕсли;

// Преобразование массива метаданных в список значений

СписокПредставленийМетаданных = Новый СписокЗначений;

Если ТипЗнч(СобытиеЖурнала.ПредставлениеМетаданных) = Тип("Массив") Тогда

СписокПредставленийМетаданных.ЗагрузитьЗначения(СобытиеЖурнала.ПредставлениеМетаданных);

Иначе

СписокПредставленийМетаданных.Добавить(Строка(СобытиеЖурнала.ПредставлениеМетаданных));

КонецЕсли;

СобытиеЖурнала.ПредставлениеМетаданных = СписокПредставленийМетаданных;

// Преобразование массива "ПредставлениеРазделенияДанныхСеанса" в список значений

Если ОбщегоНазначенияПовтИсп.РазделениеВключено()

И Не ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда

ПредставлениеРазделенияДанныхСеанса = СобытиеЖурнала.ПредставлениеРазделенияДанныхСеанса;

СписокРеквизитовРазделенияДанных = Новый СписокЗначений;

СписокРеквизитовРазделенияДанных.ЗагрузитьЗначения(ПредставлениеРазделенияДанныхСеанса);

СобытиеЖурнала.ПредставлениеРазделенияДанныхСеанса = СписокРеквизитовРазделенияДанных;

КонецЕсли;

// Обработка данных специальных событий

Если СобытиеЖурнала.Событие = "_$Access$_.Access" Тогда

СобытиеЖурнала.АдресДанных = ПоместитьВоВременноеХранилище(СобытиеЖурнала.Данные, УникальныйИдентификатор);

Если СобытиеЖурнала.Данные <> Неопределено Тогда

СобытиеЖурнала.Данные = ?(СобытиеЖурнала.Данные.Данные = Неопределено, "", "...");

КонецЕсли;

ИначеЕсли СобытиеЖурнала.Событие = "_$Access$_.AccessDenied" Тогда

СобытиеЖурнала.АдресДанных = ПоместитьВоВременноеХранилище(СобытиеЖурнала.Данные, УникальныйИдентификатор);

Если СобытиеЖурнала.Данные <> Неопределено Тогда

Если СобытиеЖурнала.Данные.Свойство("Право") Тогда

СобытиеЖурнала.Данные = НСтр("ru = 'Право:'") + " " + СобытиеЖурнала.Данные.Право;

Иначе

СобытиеЖурнала.Данные = НСтр("ru = 'Действие:'") + " " + СобытиеЖурнала.Данные.Действие +

?(СобытиеЖурнала.Данные.Данные = Неопределено, "", ", ...");

КонецЕсли;

КонецЕсли;

ИначеЕсли СобытиеЖурнала.Событие = "_$Session$_.Authentication"

ИЛИ СобытиеЖурнала.Событие = "_$Session$_.AuthenticationError" Тогда

СобытиеЖурнала.АдресДанных = ПоместитьВоВременноеХранилище(СобытиеЖурнала.Данные, УникальныйИдентификатор);

СобытиеЖурналаДанные = "";

Если СобытиеЖурнала.Данные <> Неопределено Тогда

Для каждого КлючИЗначение Из СобытиеЖурнала.Данные Цикл

Если ЗначениеЗаполнено(СобытиеЖурналаДанные) Тогда

СобытиеЖурналаДанные = СобытиеЖурналаДанные + ", ...";

Прервать;

КонецЕсли;

СобытиеЖурналаДанные = КлючИЗначение.Ключ + ": " + КлючИЗначение.Значение;

КонецЦикла;

КонецЕсли;

СобытиеЖурнала.Данные = СобытиеЖурналаДанные;

ИначеЕсли СобытиеЖурнала.Событие = "_$User$_.Delete" Тогда

СобытиеЖурнала.АдресДанных = ПоместитьВоВременноеХранилище(СобытиеЖурнала.Данные, УникальныйИдентификатор);

СобытиеЖурналаДанные = "";

Если СобытиеЖурнала.Данные <> Неопределено Тогда

Для каждого КлючИЗначение Из СобытиеЖурнала.Данные Цикл

СобытиеЖурналаДанные = КлючИЗначение.Ключ + ": " + КлючИЗначение.Значение;

Прервать;

КонецЦикла;

КонецЕсли;

СобытиеЖурнала.Данные = СобытиеЖурналаДанные;

ИначеЕсли СобытиеЖурнала.Событие = "_$User$_.New"

ИЛИ СобытиеЖурнала.Событие = "_$User$_.Update" Тогда

СобытиеЖурнала.АдресДанных = ПоместитьВоВременноеХранилище(СобытиеЖурнала.Данные, УникальныйИдентификатор);

ИмяПользователяИБ = "";

Если СобытиеЖурнала.Данные <> Неопределено Тогда

СобытиеЖурнала.Данные.Свойство("Имя", ИмяПользователяИБ);

КонецЕсли;

СобытиеЖурнала.Данные = НСтр("ru = 'Имя:'") + " " + ИмяПользователяИБ + ", ...";

КонецЕсли;

УстановитьПривилегированныйРежим(Истина);

// Уточнение имени пользователя

Если СобытиеЖурнала.Пользователь = Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000") Тогда

СобытиеЖурнала.ИмяПользователя = НСтр("ru = '<Неопределен>'");

ИначеЕсли СобытиеЖурнала.ИмяПользователя = "" Тогда

СобытиеЖурнала.ИмяПользователя = Пользователи.ПолноеИмяНеУказанногоПользователя();

ИначеЕсли ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(СобытиеЖурнала.Пользователь) = Неопределено Тогда

СобытиеЖурнала.ИмяПользователя = СобытиеЖурнала.ИмяПользователя + " " + НСтр("ru = '<Удален>'");

КонецЕсли;

Если ПроверенныеПользователи.Найти(СобытиеЖурнала.Пользователь) = Неопределено Тогда

ПроверенныеПользователи.Добавить(СобытиеЖурнала.Пользователь);

Если Пользователи.ЭтоНеразделенныйПользователь(СобытиеЖурнала.Пользователь) Тогда

ПсевдонимСлужебногоПользователя = Пользователи.ПолноеИмяСлужебногоПользователя(СобытиеЖурнала.Пользователь);

ПсевдонимыСлужебныхПользователей.Вставить(СобытиеЖурнала.Пользователь, ПсевдонимСлужебногоПользователя);

СобытиеЖурнала.ИмяПользователя = ПсевдонимСлужебногоПользователя;

КонецЕсли;

Иначе

ПсевдонимСлужебногоПользователя = ПсевдонимыСлужебныхПользователей.Получить(СобытиеЖурнала.Пользователь);

Если ПсевдонимСлужебногоПользователя <> Неопределено Тогда

СобытиеЖурнала.ИмяПользователя = ПсевдонимСлужебногоПользователя;

КонецЕсли;

КонецЕсли;

// Преобразование идентификатора в имя для использования в дальнейшем при установке отборе

СобытиеЖурнала.Пользователь = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(СобытиеЖурнала.Пользователь);

УстановитьПривилегированныйРежим(Ложь);

КонецЦикла;

ПоместитьВоВременноеХранилище(Новый Структура("СобытияЖурнала",

СобытияЖурнала), АдресХранилища);

КонецПроцедуры

// Создает пользовательское представление отбора журнала регистрации

//

// Параметры:

// ПредставлениеОтбора - Строка, строка, содержащая пользовательское представление отбора

// ОтборЖурналаРегистрации - Структура, значения отбора журнала регистрации

// ОтборЖурналаРегистрацииПоУмолчанию - Структура, значения отбора журнала регистрации по умолчанию

// (не включаются в пользовательское представления)

//

Процедура СформироватьПредставлениеОтбора(ПредставлениеОтбора, ОтборЖурналаРегистрации,

ОтборЖурналаРегистрацииПоУмолчанию = Неопределено) Экспорт

ПредставлениеОтбора = "";

// Интервал

ДатаНачалаИнтервала = Неопределено;

ДатаОкончанияИнтервала = Неопределено;

Если Не ОтборЖурналаРегистрации.Свойство("ДатаНачала", ДатаНачалаИнтервала) Или

ДатаНачалаИнтервала = Неопределено Тогда

ДатаНачалаИнтервала = '00010101000000';

КонецЕсли;

Если Не ОтборЖурналаРегистрации.Свойство("ДатаОкончания", ДатаОкончанияИнтервала) Или

ДатаОкончанияИнтервала = Неопределено Тогда

ДатаОкончанияИнтервала = '00010101000000';

КонецЕсли;

Если Не (ДатаНачалаИнтервала = '00010101000000' И ДатаОкончанияИнтервала = '00010101000000') Тогда

ПредставлениеОтбора = ПредставлениеПериода(ДатаНачалаИнтервала, ДатаОкончанияИнтервала);

КонецЕсли;

ДобавитьОграничениеВПредставлениеОтбора(ОтборЖурналаРегистрации, ПредставлениеОтбора, "Пользователь");

ДобавитьОграничениеВПредставлениеОтбора(ОтборЖурналаРегистрации, ПредставлениеОтбора,

"Событие", ОтборЖурналаРегистрацииПоУмолчанию);

ДобавитьОграничениеВПредставлениеОтбора(ОтборЖурналаРегистрации, ПредставлениеОтбора,

"ИмяПриложения", ОтборЖурналаРегистрацииПоУмолчанию);

ДобавитьОграничениеВПредставлениеОтбора(ОтборЖурналаРегистрации, ПредставлениеОтбора, "Сеанс");

ДобавитьОграничениеВПредставлениеОтбора(ОтборЖурналаРегистрации, ПредставлениеОтбора, "Уровень");

// Остальные ограничения указываем просто по представлением, без указания значений ограничения

Для Каждого ЭлементОтбора Из ОтборЖурналаРегистрации Цикл

ИмяОграничения = ЭлементОтбора.Ключ;

Если ВРег(ИмяОграничения) = ВРег("ДатаНачала")

Или ВРег(ИмяОграничения) = ВРег("ДатаОкончания")

Или ВРег(ИмяОграничения) = ВРег("Событие")

Или ВРег(ИмяОграничения) = ВРег("ИмяПриложения")

Или ВРег(ИмяОграничения) = ВРег("Пользователь")

Или ВРег(ИмяОграничения) = ВРег("Сеанс")

Или ВРег(ИмяОграничения) = ВРег("Уровень") Тогда

Продолжить; // Интервал и особые ограничения уже выводили

КонецЕсли;

// Для некоторых ограничений меняем представление

Если ВРег(ИмяОграничения) = ВРег("ИмяПриложения") Тогда

ИмяОграничения = НСтр("ru = 'Приложение'");

ИначеЕсли ВРег(ИмяОграничения) = ВРег("СтатусТранзакции") Тогда

ИмяОграничения = НСтр("ru = 'Статус транзакции'");

ИначеЕсли ВРег(ИмяОграничения) = ВРег("ПредставлениеДанных") Тогда

ИмяОграничения = НСтр("ru = 'Представление данных'");

ИначеЕсли ВРег(ИмяОграничения) = ВРег("РабочийСервер") Тогда

ИмяОграничения = НСтр("ru = 'Рабочий сервер'");

ИначеЕсли ВРег(ИмяОграничения) = ВРег("ОсновнойIPПорт") Тогда

ИмяОграничения = НСтр("ru = 'Основной IP порт'");

ИначеЕсли ВРег(ИмяОграничения) = ВРег("ВспомогательныйIPПорт") Тогда

ИмяОграничения = НСтр("ru = 'Вспомогательный IP порт'");

КонецЕсли;

Если Не ПустаяСтрока(ПредставлениеОтбора) Тогда

ПредставлениеОтбора = ПредставлениеОтбора + "; ";

КонецЕсли;

ПредставлениеОтбора = ПредставлениеОтбора + ИмяОграничения;

КонецЦикла;

Если ПустаяСтрока(ПредставлениеОтбора) Тогда

ПредставлениеОтбора = НСтр("ru = 'Не установлен'");

КонецЕсли;

КонецПроцедуры

// Служебные процедуры и функции

// Преобразование отбора.

// Отбор - отбор - передаваемый отбор.

Процедура ПреобразованиеОтбора(Отбор)

Для Каждого ЭлементОтбора Из Отбор Цикл

Если ТипЗнч(ЭлементОтбора.Значение) = Тип("СписокЗначений") Тогда

ПреобразованиеЭлементаОтбора(Отбор, ЭлементОтбора);

ИначеЕсли ВРег(ЭлементОтбора.Ключ) = ВРег("Транзакция") Тогда

Если Найти(ЭлементОтбора.Значение, "(") = 0 Тогда

Отбор.Вставить(ЭлементОтбора.Ключ, "(" + ЭлементОтбора.Значение);

КонецЕсли;

КонецЕсли;

КонецЦикла;

КонецПроцедуры

// Преобразование элемента отбора.

// Параметры:

// Отбор - отбор - передаваемый отбор.

// Отбор - Элемент отбора - - элемент передаваемого отбора.

//

Процедура ПреобразованиеЭлементаОтбора(Отбор, ЭлементОтбора)

// Эта процедура вызывается, если элемент отбора является списком значений,

// в отборе же должен быть массив значений. Преобразуем список в массив.

НовоеЗначение = Новый Массив;

Для Каждого ЗначениеИзСписка Из ЭлементОтбора.Значение Цикл

Если ВРег(ЭлементОтбора.Ключ) = ВРег("Уровень") Тогда

// Уровни сообщений представлены строкой, требуется преобразование в значение перечисления

НовоеЗначение.Добавить(Обработки.ЖурналРегистрации.УровеньЖурналаРегистрацииЗначениеПоИмени(ЗначениеИзСписка.Значение));

ИначеЕсли ВРег(ЭлементОтбора.Ключ) = ВРег("СтатусТранзакции") Тогда

// Статусы транзакций представлены строкой, требуется преобразование в значение перечисления

НовоеЗначение.Добавить(Обработки.ЖурналРегистрации.СтатусТранзакцииЗаписиЖурналаРегистрацииЗначениеПоИмени(ЗначениеИзСписка.Значение));

Иначе

НовоеЗначение.Добавить(ЗначениеИзСписка.Значение);

КонецЕсли;

КонецЦикла;

Отбор.Вставить(ЭлементОтбора.Ключ, НовоеЗначение);

КонецПроцедуры

// Добавить ограничение в представление отбора.

// Параметры:

// ОтборЖурналаРегистрации - Отбор - отбор журнала регистрации.

// ПредставлениеОтбора - Строка - представление отбора.

// ИмяОграничения - Строка - имя ограничения.

// ОтборЖурналаРегистрацииПоУмолчанию - Отбор - отбор журнала регистрации по умолчанию.

Процедура ДобавитьОграничениеВПредставлениеОтбора(ОтборЖурналаРегистрации, ПредставлениеОтбора, ИмяОграничения,

ОтборЖурналаРегистрацииПоУмолчанию = Неопределено)

СписокОграничений = "";

Ограничение = "";

Если ОтборЖурналаРегистрации.Свойство(ИмяОграничения, СписокОграничений) Тогда

// Не формируем представление отбора, если его значение соответствует значению отбора по умолчанию

Если ОтборЖурналаРегистрацииПоУмолчанию <> Неопределено Тогда

СписокОграниченийПоУмолчанию = "";

Если ОтборЖурналаРегистрацииПоУмолчанию.Свойство(ИмяОграничения, СписокОграниченийПоУмолчанию)

И ОбщегоНазначенияКлиентСервер.СпискиЗначенийИдентичны(СписокОграниченийПоУмолчанию, СписокОграничений) Тогда

Возврат;

КонецЕсли;

КонецЕсли;

Если ИмяОграничения = "Событие"

И СписокОграничений.Количество() > 5 Тогда

ПредставлениеОтбора

= СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(

НСтр("ru = 'События (%1)'"), СписокОграничений.Количество());

Иначе

Для Каждого ЭлементСписка Из СписокОграничений Цикл

Если Не ПустаяСтрока(Ограничение) Тогда

Ограничение = Ограничение + ", ";

КонецЕсли;

Если ВРег(ИмяОграничения) = ВРег("Сеанс")

ИЛИ ВРег(ИмяОграничения) = ВРег("Уровень")

И ПустаяСтрока(Ограничение) Тогда

Ограничение = НСтр("ru = '[ИмяОграничения]: [Значение]'");

Ограничение = СтрЗаменить(Ограничение, "[Значение]", ЭлементСписка.Значение);

Ограничение = СтрЗаменить(Ограничение, "[ИмяОграничения]", ИмяОграничения);

ИначеЕсли ВРег(ИмяОграничения) = ВРег("Сеанс")

ИЛИ ВРег(ИмяОграничения) = ВРег("Уровень")Тогда

Ограничение = Ограничение + ЭлементСписка.Значение;

Иначе

Ограничение = Ограничение + ЭлементСписка.Представление;

КонецЕсли;

КонецЦикла;

Если Не ПустаяСтрока(ПредставлениеОтбора) Тогда

ПредставлениеОтбора = ПредставлениеОтбора + "; ";

КонецЕсли;

ПредставлениеОтбора = ПредставлениеОтбора + Ограничение;

КонецЕсли;

КонецЕсли;

КонецПроцедуры

Общий модуль «Обновление информационной базы»

// Подсистема "Обновление версии ИБ"

// Серверные процедуры и функции обновления информационной базы

// при смене версии конфигурации.

// Программный интерфейс

// Проверить необходимость обновления информационной базы при смене версии конфигурации.

//

Функция НеобходимоОбновлениеИнформационнойБазы() Экспорт

УстановитьПривилегированныйРежим(Истина);

Если НеобходимоВыполнитьОбновление(Метаданные.Версия, ВерсияИБ(Метаданные.Имя)) Тогда

Возврат Истина;

КонецЕсли;

Возврат Ложь;

КонецФункции

// Возвращает Истина при необходимости обновления конфигурации информационной базы подчиненного узла РИБ.

// В главном узле всегда - Ложь.

Функция ТребуетсяОбновлениеКонфигурацииУзлаРИБ() Экспорт

Возврат КонфигурацияИзменена() И ОбщегоНазначения.ЭтоПодчиненныйУзелРИБ();

КонецФункции

// Обновление ИБ будет выполнено вне зависимости от изменения версии конфигурации.

// Если версия конфигурации не изменилась, будут выполнены только обязательные

// обработчики обновления (у которых версия = "*").

// Необходимость снимается автоматически после обновления ИБ.

// Не используется в модели сервиса.

Процедура УстановитьНеобходимостьОбновленияИнформационнойБазы() Экспорт

// В текущей конфигурации действий не требуется

КонецПроцедуры

Служебный программный интерфейс

// Проверить необходимость обновления неразделенных данных информационной базы

// при смене версии конфигурации.

Функция НеобходимоОбновлениеНеразделенныхДанныхИнформационнойБазы() Экспорт

УстановитьПривилегированныйРежим(Истина);

Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда

ВерсияМетаданных = Метаданные.Версия;

Если ПустаяСтрока(ВерсияМетаданных) Тогда

ВерсияМетаданных = "0.0.0.0";

КонецЕсли;

ВерсияОбщихДанных = ВерсияИБ(Метаданные.Имя, Истина);

Если НеобходимоВыполнитьОбновление(ВерсияМетаданных, ВерсияОбщихДанных) Тогда

Возврат Истина;

КонецЕсли;

КонецЕсли;

Возврат Ложь;

КонецФункции

// Возвращает текст причины блокировки, если требуется обновление ИБ и у текущего пользователя

// для этого недостаточно прав, иначе возвращает пустую строку.

// Параметры:

// УчитыватьПривилегированныйРежим - Булево. Начальное значение Истина. Если указать Ложь,

// то при проверке полноправности текущего пользователя

// наличие привилегированного режиме не будет учитываться

// ПриЗапускеКлиентскогоПриложения - Булево. Начальное значение Ложь. Если указать Истина,

// тогда в случае, если выполнен запуск с пустым списком

// пользователей, то возвращается пустая строка, вместо

// сообщения о недостатке прав (когда есть недостаток),

//т.к. проверка на запуск с пустым списком пользователей

// при недостатке прав проверяется позднее и отдельно,

// в результате чего происходит добавление пользователя ИБ

//администратор с ролями АдминистраторСистемы и ПолныеПрава.

// Возвращаемое значение:

// Строка. Если база не заблокирована, тогда пустая строка, иначе сообщение о причине блокировки

Функция ИнформационнаяБазаЗаблокированаДляОбновления(УчитыватьПривилегированныйРежим = Истина, Знач ПриЗапускеКлиентскогоПриложения = Ложь) Экспорт

Сообщение = "";

// Проверка необходимости обновления информационной базы.

// Проверка наличия прав для обновления информационной базы.

Если НЕ ПустаяСтрока(Метаданные.Версия)

И Константы.НомерВерсииКонфигурации.Получить() <> Метаданные.Версия И

(НЕ ПравоДоступа("МонопольныйРежим", Метаданные)

ИЛИ НЕ ПравоДоступа("Использование", Метаданные.Обработки.ОбновлениеИнформационнойБазы)

ИЛИ НЕ ПравоДоступа("Просмотр", Метаданные.Обработки.ОбновлениеИнформационнойБазы)) Тогда

Сообщение = "Недостаточно прав для выполнения обновления. Работа системы будет завершена.";

КонецЕсли;

Возврат Сообщение;

КонецФункции

// Получить версию конфигурации или родительской конфигурации (библиотеки),

// которая хранится в информационной базе.

// Параметры

// ИдентификаторБиблиотеки – Строка – имя конфигурации или идентификатор библиотеки.

// Возвращаемое значение:

// Строка – версия.

// Пример использования:

// ВерсияКонфигурацииИБ = ВерсияИБ(Метаданные.Имя);

Функция ВерсияИБ(Знач ИдентификаторБиблиотеки, Знач ПолучитьВерсиюОбщихДанных = Ложь) Экспорт

УстановитьПривилегированныйРежим(Истина);

СтандартнаяОбработка = Истина;

Результат = "";

Если ИдентификаторБиблиотеки = "СтандартныеПодсистемы" Тогда

Результат = "2.1.3.48";

Иначе

Результат = Константы.НомерВерсииКонфигурации.Получить();

КонецЕсли;

Возврат ?(ПустаяСтрока(Результат), "0.0.0.0", Результат);

КонецФункции

// Возвращает Истина если запуск информационной базы

// выполняется первый раз, иначе возвращает Ложь.

Функция ПервыйЗапускИнформационнойБазы() Экспорт

УстановитьПривилегированныйРежим(Истина);

Возврат (Константы.НомерВерсииКонфигурации.Получить()="");

КонецФункции

// Процедуры для установки/обновления/получения параметров работы программы (кэшей).

// Возвращает параметры работы программы для использования (фиксированные данные),

// которые являются, например, кэшем.

Функция ПараметрыРаботыПрограммы(ИмяКонстанты) Экспорт

Возврат ОбновлениеИнформационнойБазыСлужебныйПовтИсп.ПараметрыРаботыПрограммы(ИмяКонстанты);

КонецФункции

// Возвращает изменения параметра работы программы с учетом текущей версии

// конфигурации и текущей версии ИБ.

// Параметры:

// Параметры - значение извлеченное из константы, имя которой передавалось

// в процедуру ДобавитьИзмененияПараметраРаботыПрограммы.

// ИмяПараметра - Строка, которая передавалась, как параметр ИмяПараметра

// в процедуру ДобавитьИзмененияПараметраРаботыПрограммы.

// Возвращаемое значение:

// Массив - содержит значения изменений. Может быть несколько, например,

// когда область данных давно не обновлялась.

Функция ИзмененияПараметраРаботыПрограммы(Параметры, ИмяПараметра) Экспорт

ПоследниеИзменения = Параметры["ИзмененияПараметра" + ИмяПараметра].Получить();

Версия = Метаданные.Версия;

СледующаяВерсия = СледующаяВерсия(Версия);

Если ОбщегоНазначенияПовтИсп.РазделениеВключено()

И НЕ ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда

ВерсияИБ = ОбновлениеИнформационнойБазыСлужебныйПовтИсп.МинимальнаяВерсияИБ();

ВерсияОбщихДанных = ВерсияИБ(Метаданные.Имя, Истина);

ОбновлениеВнеОбновленияИБ = ОбщегоНазначенияКлиентСервер.СравнитьВерсии(ВерсияОбщихДанных, Версия) = 0;

Иначе

ВерсияИБ = ВерсияИБ(Метаданные.Имя);

ОбновлениеВнеОбновленияИБ = ОбщегоНазначенияКлиентСервер.СравнитьВерсии(ВерсияИБ, Версия) = 0;

КонецЕсли;

// Изменения к более старшим версиям не нужны,

// кроме случая когда обновление выполняется вне обновления ИБ,

// т.е. версия ИБ равна версии конфигурации.

// В этом случае дополнительно выбираются изменения к следующей версии.

Индекс = ПоследниеИзменения.Количество()-1;

Пока Индекс >=0 Цикл

ВерсияИзменения = ПоследниеИзменения[Индекс].ВерсияКонфигурации;

Если ОбщегоНазначенияКлиентСервер.СравнитьВерсии(ВерсияИБ, ВерсияИзменения) >= 0

И НЕ (ОбновлениеВнеОбновленияИБ

И ОбщегоНазначенияКлиентСервер.СравнитьВерсии(СледующаяВерсия, ВерсияИзменения) = 0) Тогда

ПоследниеИзменения.Удалить(Индекс);

КонецЕсли;

Индекс = Индекс - 1;

КонецЦикла;

Возврат ПоследниеИзменения.ВыгрузитьКолонку("Изменения");

КонецФункции

// Устанавливает вспомогательные данные для работы программы, хранимые в неразделенных константах.

// Параметры:

// ИмяКонстанты - Строка - имя неразделенной константы, в которой сохраняется значение параметра.

// ИмяПараметра - Строка - имя параметра, который нужно установить (без приставки ИзмененияПараметра).

// ЗначениеПараметра - фиксированные данные, которые устанавливаются в качестве значения параметра.

Процедура УстановитьПараметрРаботыПрограммы(ИмяКонстанты, ИмяПараметра, ЗначениеПараметра) Экспорт

Блокировка = Новый БлокировкаДанных;

ЭлементБлокировки = Блокировка.Добавить("Константа." + ИмяКонстанты);

ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;

НачатьТранзакцию();

Попытка

Блокировка.Заблокировать();

Параметры = Константы[ИмяКонстанты].Получить().Получить();

Если ТипЗнч(Параметры) <> Тип("Структура") Тогда

Параметры = Новый Структура;

КонецЕсли;

Параметры.Вставить(ИмяПараметра, ЗначениеПараметра);

Константы[ИмяКонстанты].Установить(Новый ХранилищеЗначения(Параметры));

ЗафиксироватьТранзакцию();

Исключение

ОтменитьТранзакцию();

ВызватьИсключение;

КонецПопытки;

ОбновитьПовторноИспользуемыеЗначения();

КонецПроцедуры

// Добавить изменения вспомогательных данных для работы программы, хранимые в неразделенных константах.

// Параметры:

// ИмяКонстанты - Строка - имя неразделенной константы, в которой сохраняется значение параметра.

// ИмяПараметра - Строка - имя параметра, который нужно установить.

// ИзмененияПараметра - фиксированные данные, которые регистрируются в качестве изменений параметра.

// Изменения не добавляются, если значение ИзменениеПараметра не заполнено.

Процедура ДобавитьИзмененияПараметраРаботыПрограммы(ИмяКонстанты, ИмяПараметра, ИзмененияПараметра) Экспорт

Блокировка = Новый БлокировкаДанных;

ЭлементБлокировки = Блокировка.Добавить("Константа." + ИмяКонстанты);

ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;

НачатьТранзакцию();

Попытка

Блокировка.Заблокировать();

ОбновитьСоставИзменений = Ложь;

Параметры = ОбновлениеИнформационнойБазыСлужебныйПовтИсп.ПараметрыРаботыПрограммы(ИмяКонстанты);

ИмяПараметраХраненияИзменений = "ИзмененияПараметра" + ИмяПараметра;

Если Параметры.Свойство(ИмяПараметраХраненияИзменений) Тогда

ПоследниеИзменения = Параметры[ИмяПараметраХраненияИзменений].Получить();

Если ТипЗнч(ПоследниеИзменения) <> Тип("ТаблицаЗначений")

ИЛИ ПоследниеИзменения.Колонки.Количество() <> 2

ИЛИ ПоследниеИзменения.Колонки[0].Имя <> "ВерсияКонфигурации"

ИЛИ ПоследниеИзменения.Колонки[1].Имя <> "Изменения" Тогда

ПоследниеИзменения = Неопределено;

КонецЕсли;

Иначе

ПоследниеИзменения = Неопределено;

КонецЕсли;

Если ПоследниеИзменения = Неопределено Тогда

ОбновитьСоставИзменений = Истина;

ПоследниеИзменения = Новый ТаблицаЗначений;

ПоследниеИзменения.Колонки.Добавить("ВерсияКонфигурации");

ПоследниеИзменения.Колонки.Добавить("Изменения");

КонецЕсли;

Если ЗначениеЗаполнено(ИзмененияПараметра) Тогда

// Если производится обновление вне обновления ИБ,

// тогда требуется добавить изменения к следующей версии,

// чтобы при переходе на очередную версию изменения

// выполненные вне обновления ИБ были учтены.

Версия = Метаданные.Версия;

ОбновлениеВнеОбновленияИБ = ОбщегоНазначенияКлиентСервер.СравнитьВерсии(

ВерсияИБ(Метаданные.Имя) , Версия) = 0;

Если ОбновлениеВнеОбновленияИБ Тогда

Версия = СледующаяВерсия(Версия);

КонецЕсли;

ОбновитьСоставИзменений = Истина;

Строка = ПоследниеИзменения.Добавить();

Строка.Изменения = ИзмененияПараметра;

Строка.ВерсияКонфигурации = Версия;

КонецЕсли;

МинимальнаяВерсияИБ = ОбновлениеИнформационнойБазыСлужебныйПовтИсп.МинимальнаяВерсияИБ();

// Удаление изменений для версий ИБ, которые меньше минимальной

// вместо версий меньше или равных минимальной, чтобы обеспечить

// возможность обновления вне обновления ИБ.

Индекс = ПоследниеИзменения.Количество()-1;

Пока Индекс >=0 Цикл

ВерсияИзменения = ПоследниеИзменения[Индекс].ВерсияКонфигурации

Если ОбщегоНазначенияКлиентСервер.СравнитьВерсии(МинимальнаяВерсияИБ, ВерсияИзменения) > 0 Тогда

ПоследниеИзменения.Удалить(Индекс);

ОбновитьСоставИзменений = Истина;

КонецЕсли;

Индекс = Индекс - 1;

КонецЦикла;

Если ОбновитьСоставИзменений Тогда

УстановитьПараметрРаботыПрограммы(

ИмяКонстанты,

ИмяПараметраХраненияИзменений,

Новый ХранилищеЗначения(ПоследниеИзменения));

КонецЕсли;

ЗафиксироватьТранзакцию();

Исключение

ОтменитьТранзакцию();

ВызватьИсключение;

КонецПопытки;

КонецПроцедуры

// Служебные процедуры и функци

// Для внутреннего использования.

Функция НеобходимоВыполнитьОбновление(Знач ВерсияМетаданных, Знач ВерсияДанных) Экспорт

Возврат НЕ ПустаяСтрока(ВерсияМетаданных) И ВерсияДанных <> ВерсияМетаданных;

КонецФункции

// Протоколирование хода обновления

// Возвращает строковую константу для формирования сообщений журнала регистрации.

// Возвращаемое значение:

// Строка

Функция СобытиеЖурналаРегистрации() Экспорт

Возврат НСтр("ru = 'Обновление информационной базы'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка());

КонецФункции

Функция СобытиеЖурналаРегистрацииПротокол() Экспорт

Возврат СобытиеЖурналаРегистрации() + ". " + НСтр("ru = 'Протокол выполнения'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка());

КонецФункции

// Вспомогательные процедуры и функции

// Общего назначения

Функция СледующаяВерсия(Версия)

Массив = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(Версия, ".");

Возврат ОбщегоНазначенияКлиентСервер.ВерсияКонфигурацииБезНомераСборки(

Версия) + "." + Формат(Число(Массив[3]) + 1, "ЧГ=");

КонецФункции

Общий модуль «Общего назначения вызов сервера»

// Подсистема "Базовая функциональность".

// ПРОГРАММНЫЙ ИНТЕРФЕЙС

// Функции для работы с журналом регистрации

// Процедура пакетной записи сообщений в журнал регистрации

// Параметры: СобытияДляЖурналаРегистрации - массив структур, клиентская глобальная переменная

// Каждая структура - сообщение для журнала регистрации.

// После записи переменная очищается.

Процедура ЗаписатьСобытияВЖурналРегистрации(СобытияДляЖурналаРегистрации) Экспорт

ОбщегоНазначения.ЗаписатьСобытияВЖурналРегистрации(СобытияДляЖурналаРегистрации);

КонецПроцедуры

// Включить запись уровней событий СписокУровней в журнале регистрации.

// Параметры: УровниСобытий - СписокЗначений - наименования уровней регистрации событий,

// которые необходимо включить

Процедура ВключитьИспользованиеЖурналаРегистрации(СписокУровней = Неопределено) Экспорт

ОбщегоНазначения.ВключитьИспользованиеЖурналаРегистрации(СписокУровней);

КонецПроцедуры

// Проверяет, включена ли регистрация событий УровниСобытий в журнале регистрации.

// Параметры:

// УровниСобытий - СписокЗначений - список строк с уровнями регистрации событий журнала регистрации,

// для которых необходимо проверить, что они включены.

// Если Неопределено, то проверяются все уровни событий.

// Возвращаемое значение:

// Булево - Истина, когда заданные режимы включены. Иначе - Ложь.

Функция ПроверитьВключениеЖурналаРегистрации(УровниСобытий = Неопределено) Экспорт

Возврат ОбщегоНазначения.ПроверитьВключениеЖурналаРегистрации(УровниСобытий);

КонецФункции

// Общие процедуры и функции для работы с данными в базе

// Проверяет наличие ссылок на объект в базе данных.

// Параметры:

// Ссылка - ЛюбаяСсылка

// - Массив значений типа ЛюбаяСсылка

// ИскатьСредиСлужебныхОбъектов - Булево - начальное значение Ложь,

// когда установлено Истина, тогда не будет учитываться

// исключения поиска ссылок, заданные при разработке конфигурации.

// Возвращаемое значение:

// Булево.

Функция ЕстьСсылкиНаОбъект(Знач СсылкаИлиМассивСсылок, Знач ИскатьСредиСлужебныхОбъектов = Ложь) Экспорт

Возврат ОбщегоНазначения.ЕстьСсылкиНаОбъект(СсылкаИлиМассивСсылок, ИскатьСредиСлужебныхОбъектов);

КонецФункции

// Проверяет проведенность документов

// Параметры:

// Документы - Массив - документы, проведенность которых необходимо проверить

// Возвращаемое значение:

// Массив - непроведенные документы из массива Документы

Функция ПроверитьПроведенностьДокументов(знач Документы) Экспорт

Возврат ОбщегоНазначения.ПроверитьПроведенностьДокументов(Документы);

КонецФункции

// Выполняет попытку проведения документов.

// Параметры:

//Документы - Массив - документы, которые необходимо провести.

// Возвращаемое значение:

//Массив - массив структур с полями:

Ссылка - документ, который не удалось провести;

ОписаниеОшибки - текст описания ошибки при проведении.

Функция ПровестиДокументы(Документы) Экспорт

Возврат ОбщегоНазначения.ПровестиДокументы(Документы);

КонецФункции

// Общие процедуры и функции для работы в режиме разделения данных

// Устанавливает разделение сеанса.

// Параметры:

// Использование - Булево - Использование разделителя ОбластьДанных в сеансе

// ОбластьДанных - Число - Значение разделителя ОбластьДанных

Процедура УстановитьРазделениеСеанса(Знач Использование, Знач ОбластьДанных = Неопределено) Экспорт

ОбщегоНазначения.УстановитьРазделениеСеанса(Использование, ОбластьДанных

КонецПроцедуры

// Сохранение, чтение и удаление настроек из хранилищ

// Сохраняет настройку в хранилище общих настроек.

// Параметры:

// Соответствуют методу ХранилищеОбщихНастроекСохранить.Сохранить,

// подробнее - см. параметры процедуры ХранилищеСохранить()

Процедура ХранилищеОбщихНастроекСохранить(КлючОбъекта, КлючНастроек = "", Значение, ОписаниеНастроек = Неопределено,

ИмяПользователя = Неопределено, НужноОбновитьПовторноИспользуемыеЗначения = Ложь) Экспорт

ОбщегоНазначения.ХранилищеОбщихНастроекСохранить(

КлючОбъекта,

КлючНастроек,

Значение,

ОписаниеНастроек,

ИмяПользователя,

НужноОбновитьПовторноИспользуемыеЗначения);

КонецПроцедуры

// Загружает настройку из хранилища общих настроек.

// Параметры:

// Соответствуют методу ХранилищеОбщихНастроек.Загрузить,

// подробнее - см. параметры функции ХранилищеЗагрузить()

Функция ХранилищеОбщихНастроекЗагрузить(КлючОбъекта, КлючНастроек = "", ЗначениеПоУмолчанию = Неопределено,

ОписаниеНастроек = Неопределено, ИмяПользователя = Неопределено) Экспорт

Возврат ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить(

КлючОбъекта,

КлючНастроек,

ЗначениеПоУмолчанию,

ОписаниеНастроек,

ИмяПользователя);

КонецФункции

// Удаляет настройку из хранилища общих настроек.

// Параметры:

// Соответствуют методу ХранилищеОбщихНастроек.Удалить,

// подробнее - см. параметры функции ХранилищеУдалить()

Процедура ХранилищеОбщихНастроекУдалить(КлючОбъекта, КлючНастроек, ИмяПользователя) Экспорт

ОбщегоНазначения.ХранилищеОбщихНастроекУдалить(КлючОбъекта, КлючНастроек, ИмяПользователя);

КонецПроцедуры

// Сохраняет массив пользовательских настроек МассивСтруктур.

// Может применяться для случаев вызова с клиента.

// Параметры:

// МассивСтруктур - Массив - массив структур с полями "Объект", "Настройка", "Значение".

// НужноОбновитьПовторноИспользуемыеЗначения - Булево - требуется обновить повторно используемые значения

Процедура ХранилищеОбщихНастроекСохранитьМассив(МассивСтруктур, НужноОбновитьПовторноИспользуемыеЗначения = Ложь) Экспорт

ОбщегоНазначения.ХранилищеОбщихНастроекСохранитьМассив(МассивСтруктур, НужноОбновитьПовторноИспользуемыеЗначения);

КонецПроцедуры

// Сохраняет массив пользовательских настроек МассивСтруктур и обновляет повторно

// используемые значения. Может применяться для случаев вызова с клиента.

// Параметры:

// МассивСтруктур - Массив - массив структур с полями "Объект", "Настройка", "Значение".

Процедура ХранилищеОбщихНастроекСохранитьМассивИОбновитьПовторноИспользуемыеЗначения(МассивСтруктур) Экспорт

ОбщегоНазначения.ХранилищеОбщихНастроекСохранитьМассивИОбновитьПовторноИспользуемыеЗначения(МассивСтруктур);

КонецПроцедуры

// Сохраняет настройку в хранилище общих настроек и обновляет повторно используемые

// значения.

// Параметры:

// Соответствуют методу ХранилищеОбщихНастроекСохранить.Сохранить,

// подробнее - см. параметры процедуры ХранилищеСохранить()

Процедура ХранилищеОбщихНастроекСохранитьИОбновитьПовторноИспользуемыеЗначения(КлючОбъекта, КлючНастроек, Значение) Экспорт

ОбщегоНазначения.ХранилищеОбщихНастроекСохранитьИОбновитьПовторноИспользуемыеЗначения(КлючОбъекта, КлючНастроек, Значение);

КонецПроцедуры

// Сохраняет настройку в хранилище системных настроек.

// Параметры:

// Соответствуют методу ХранилищеСистемныхНастроек.Сохранить,

// подробнее - см. параметры процедуры ХранилищеСохранить()

Процедура ХранилищеСистемныхНастроекСохранить(КлючОбъекта, КлючНастроек = "", Значение, ОписаниеНастроек = Неопределено,

ИмяПользователя = Неопределено, НужноОбновитьПовторноИспользуемыеЗначения = Ложь) Экспорт

ОбщегоНазначения.ХранилищеСистемныхНастроекСохранить(

КлючОбъекта,

КлючНастроек,

Значение,

ОписаниеНастроек,

ИмяПользователя,

НужноОбновитьПовторноИспользуемыеЗначения);

КонецПроцедуры

// Загружает настройку из хранилища системных настроек.

// Параметры:

// Соответствуют методу ХранилищеСистемныхНастроек.Загрузить,

// подробнее - см. параметры функции ХранилищеЗагрузить()

Функция ХранилищеСистемныхНастроекЗагрузить(КлючОбъекта, КлючНастроек = "", ЗначениеПоУмолчанию = Неопределено,

ОписаниеНастроек = Неопределено, ИмяПользователя = Неопределено) Экспорт

Возврат ОбщегоНазначения.ХранилищеСистемныхНастроекЗагрузить(

КлючОбъекта,

КлючНастроек,

ЗначениеПоУмолчанию,

ОписаниеНастроек,

ИмяПользователя);

КонецФункции

// Удаляет настройку из хранилища системных настроек.

// Параметры:

// Соответствуют методу ХранилищеСистемныхНастроек.Удалить,

// подробнее - см. параметры функции ХранилищеУдалить()

Процедура ХранилищеСистемныхНастроекУдалить(КлючОбъекта, КлючНастроек, ИмяПользователя) Экспорт

ОбщегоНазначения.ХранилищеСистемныхНастроекУдалить(КлючОбъекта, КлючНастроек, ИмяПользователя);

КонецПроцедуры

// Сохраняет настройку в хранилище настроек данных форм.

// Параметры:

// Соответствуют методу ХранилищеСистемныхНастроек.Сохранить,

// подробнее - см. параметры процедуры ХранилищеСохранить()

Процедура ХранилищеНастроекДанныхФормСохранить(КлючОбъекта, КлючНастроек = "", Значение, ОписаниеНастроек = Неопределено,

ИмяПользователя = Неопределено, НужноОбновитьПовторноИспользуемыеЗначения = Ложь) Экспорт

ОбщегоНазначения.ХранилищеНастроекДанныхФормСохранить(

КлючОбъекта,

КлючНастроек,

Значение,

ОписаниеНастроек,

ИмяПользователя,

НужноОбновитьПовторноИспользуемыеЗначения);

КонецПроцедуры

// Загружает настройку из хранилища настроек данных форм.

// Параметры:

// Соответствуют методу ХранилищеСистемныхНастроек.Загрузить,

// подробнее - см. параметры функции ХранилищеЗагрузить()

Функция ХранилищеНастроекДанныхФормЗагрузить(КлючОбъекта, КлючНастроек = "", ЗначениеПоУмолчанию = Неопределено,

ОписаниеНастроек = Неопределено, ИмяПользователя = Неопределено) Экспорт

Возврат ОбщегоНазначения.ХранилищеНастроекДанныхФормЗагрузить(

КлючОбъекта,

КлючНастроек,

ЗначениеПоУмолчанию,

ОписаниеНастроек,

ИмяПользователя);

КонецФункции

// Удаляет настройку из хранилища настроек данных форм.

// Параметры:

// Соответствуют методу ХранилищеНастроекДанныхФорм.Удалить,

// подробнее - см. параметры функции ХранилищеУдалить()

Процедура ХранилищеНастроекДанныхФормУдалить(КлючОбъекта, КлючНастроек, ИмяПользователя) Экспорт

ОбщегоНазначения.ХранилищеНастроекДанныхФормУдалить(КлючОбъекта, КлючНастроек, ИмяПользователя);

КонецПроцедуры

// Функции для работы с цветами стиля в клиентском коде

// Функция получает цвет стиля по имени элемента стиля

// Параметры:

// ИмяЦветаСтиля - Строка - Имя элемента стиля.

// Возвращаемое значение:

// Цвет.

Функция ЦветСтиля(ИмяЦветаСтиля) Экспорт

Возврат ЦветаСтиля[ИмяЦветаСтиля];

КонецФункции

// Функция получает шрифт стиля по имени элемента стиля.

// Параметры:

// ИмяШрифтаСтиля - Строка - Имя шрифта стиля.

// Возвращаемое значение:

// Шрифт.

Функция ШрифтСтиля(ИмяШрифтаСтиля) Экспорт

Возврат ШрифтыСтиля[ИмяШрифтаСтиля];

КонецФункции

Общий модуль «Общего назначения клиент»

// Подсистема "Базовая функциональность".

// В этом модуле содержится реализация обработчиков модуля приложения.

// ПРОГРАММНЫЙ ИНТЕРФЕЙС

// Выполняется перед интерактивном началом работы пользователя с областью данных.

// Соответствует обработчику ПередНачаломРаботыСистемы

// Параметры:

// Отказ - Булево - отказ в от начала работы. Если параметр установить в Истина,

// начало работы с областью осуществлено не будет.

Процедура ПередНачаломРаботыСистемы(Отказ) Экспорт

КонецПроцедуры

// Выполняется при интерактивном начале работы пользователя с областью данных.

// Соответствует обработчику ПриНачалеРаботыСистемы

// Параметры

// ОбрабатыватьПараметрыЗапуска - Булево - Истина, если обработчик вызван при

// непосредственном входе пользователя в систему и должен обработать параметры

// запуска (если это предусмотрено его логикой). Иначе обработчика вызван

// при интерактивном входе неразделенного пользователя в область данных и

// обрабатывать параметры запуска не следует.

Процедура ПриНачалеРаботыСистемы(Знач ОбрабатыватьПараметрыЗапуска = Ложь) Экспорт

КонецПроцедуры

// Обработать параметры запуска программы.

// Реализация функции может быть расширена для обработки новых параметров.

// Параметры

// ЗначениеПараметраЗапуска - Строка - первое значение параметра запуска,

// до первого символа ";"

// ПараметрыЗапуска – Строка – параметр запуска, переданный в конфигурацию

// с помощью ключа командной строки /C.

// Возвращаемое значение:

// Булево – Истина, если необходимо прервать выполнение процедуры ПриНачалеРаботыСистемы.

Функция ОбработатьПараметрыЗапуска(ЗначениеПараметраЗапуска, ПараметрыЗапуска) Экспорт

Возврат Ложь;

КонецФункции

// Соответствует обработчику ПередЗавершениемРаботыСистемы.

Процедура ПередЗавершениемРаботыСистемы(Отказ) Экспорт

КонецПроцедуры

Глобальный общий модуль

&НаСервере

Функция ПолучитьПериод() Экспорт

Период = Константы.ПериодНапоминанияЗадачи.Получить() * 60;

возврат Период;

КонецФункции

&НаСервере

Функция ОповещениеПользователейСервер() ЭКСПОРТ

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Задачи.Ссылка

|ИЗ

| Задача.Задачи КАК Задачи

|ГДЕ

| Задачи.ДатаНапоминания <= &ДатаНапоминания

| И Задачи.Выполнена = &Выполнена";

Выполнена = Ложь;

Запрос.УстановитьПараметр("Выполнена", Выполнена);

Запрос.УстановитьПараметр("ДатаНапоминания", ТекущаяДата());

РезультатЗапроса = Запрос.Выполнить();

ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

ТаблицаЗначений = Новый Массив;

Пока ВыборкаДетальныеЗаписи.Следующий() Цикл

ТаблицаЗначений.Добавить(ВыборкаДетальныеЗаписи.Ссылка);

КонецЦикла;

Возврат ТаблицаЗначений;

КонецФункции

&НаСервере

Функция ПолучитьОбъектЗадачи(Ссылка) Экспорт

Возврат Ссылка.ПолучитьОбъект().ПолучитьФорму();

КонецФункции

&Клиент

Процедура ОткрытьФормуЗадачи(Объект)

Объект.ПолучитьФорму().Открыть();

КонецПроцедуры

Общий модуль «Задачи»

&НаСервере

Функция ПолучитьПериод() Экспорт

Период = Константы.ПериодНапоминанияЗадачи.Получить() * 60;

возврат Период;

КонецФункции

&НаСервере

Функция ОповещениеПользователейСервер() ЭКСПОРТ

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Задачи.Ссылка

|ИЗ

| Задача.Задачи КАК Задачи

|ГДЕ

| Задачи.ДатаНапоминания <= &ДатаНапоминания

| И Задачи.Выполнена = &Выполнена";

Выполнена = Ложь;

Запрос.УстановитьПараметр("Выполнена", Выполнена);

Запрос.УстановитьПараметр("ДатаНапоминания", ТекущаяДата());

РезультатЗапроса = Запрос.Выполнить();

ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

ТаблицаЗначений = Новый Массив;

Пока ВыборкаДетальныеЗаписи.Следующий() Цикл

ТаблицаЗначений.Добавить(ВыборкаДетальныеЗаписи.Ссылка);

КонецЦикла;

Возврат ТаблицаЗначений;

КонецФункции

&НаСервере

Функция ПолучитьОбъектЗадачи(Ссылка) Экспорт

Возврат Ссылка.ПолучитьОбъект().ПолучитьФорму();

КонецФункции

&Клиент

Процедура ОткрытьФормуЗадачи(Объект)

Объект.ПолучитьФорму().Открыть();

КонецПроцедуры

Документ «Акт об оказании услуги»

Процедура ОбработкаПроведения(Отказ, Режим)

// регистр ОстаткиЗаготовок Расход

Движения.ОстаткиМатериалов.Записывать = Истина;

Движения.СтоимостьМатериалов.Записывать = Истина;

Движения.Продажи.Записывать = Истина;

Для Каждого ТекСтрокаУслуги Из Услуги Цикл

Если ТекСтрокаУслуги.Услуга.ВидУслуги = Перечисления.ВидыУслуг.Материал Тогда

Движение = Движения.ОстаткиМатериалов.Добавить();

Движение.ВидДвижения = ВидДвиженияНакопления.Расход;

Движение.Период = Дата;

Движение.Материал = ТекСтрокаУслуги.Услуга;

Движение.Количество = ТекСтрокаУслуги.Количество;

// регистр СтоимостьМатериалов Расход

Движение = Движения.СтоимостьМатериалов.Добавить();

Движение.ВидДвижения = ВидДвиженияНакопления.Расход;

Движение.Период = Дата;

Движение.Материал = ТекСтрокаУслуги.Услуга;

КонецЕсли;

//регистрПродажи

Движение = Движения.Продажи.Добавить();

Движение.Период = Дата;

Движение.Услуга = ТекСтрокаУслуги.Услуга;

Движение.Заказчик = Заказчик;

Движение.Сотрудник = Сотрудник;

Движение.Количество = ТекСтрокаУслуги.Количество;

Движение.Выручка = ТекСтрокаУслуги.Сумма;

КонецЦикла;

Если ЭтотОбъект.ДатаГотовностиЗаказа = Дата(1,1,1) Тогда

ЭтотОбъект.ДатаГотовностиЗаказа = ТекущаяДата()+(3600*48)

КонецЕсли;

Если ЭтотОбъект.Задача = Задачи.Задачи.ПустаяСсылка() Тогда

НоваяЗадача = Задачи.Задачи.СоздатьЗадачу();

НоваяЗадача.Дата = ТекущаяДата();

НоваяЗадача.ДатаНапоминания = ЭтотОбъект.ДатаГотовностиЗаказа;

НоваяЗадача.Клиент = ЭтотОбъект.Заказчик;

НоваяЗадача.Заказ = ЭтотОбъект.Ссылка;

НоваяЗадача.Наименование = "Готов заказ клиента";

НоваяЗадача.Сообщение = "Необходимо позвонить клиенту - "+ НоваяЗадача.Клиент + " - " + НоваяЗадача.Клиент.ТелефонЗаказчика + " его заказ готов!";

НоваяЗадача.Записать();

Иначе

ТекЗадача = ЭтотОбъект.Задача.ПолучитьОбъект();

ТекЗадача.ДатаНапоминания = ЭтотОбъект.ДатаГотовностиЗаказа;

ТекЗадача.Записать();

КонецЕсли;

Общий модуль «Стандартные подсистемы клиент сервер»

// СЛУЖЕБНЫЙ ПРОГРАММНЫЙ ИНТЕРФЕЙС

// Обработка результата выполнения

// Формирует шаблон результата выполнения.

// Возвращаемое значение:

//Результат (Структура) См. СтандартныеПодсистемыКлиент.ПоказатьРезультатВыполнения().

Функция НовыйРезультатВыполнения(Результат = Неопределено) Экспорт

Если Результат = Неопределено Тогда

Результат = Новый Структура;

КонецЕсли;

Результат.Вставить("ВыводОповещения", Новый Структура("Использование, Заголовок, Ссылка, Текст, Картинка", Ложь));

Результат.Вставить("ВыводСообщения", Новый Структура("Использование, Текст, ПутьКРеквизитуФормы", Ложь));

Результат.Вставить("ВыводПредупреждения", Новый Структура("Использование, Текст, ПутьКРеквизитуФормы, ТекстОшибок", Ложь));

Результат.Вставить("ОповещениеФорм", Новый Структура("Использование, ИмяСобытия, Параметр, Источник", Ложь));

Результат.Вставить("ОповещениеДинамическихСписков", Новый Структура("Использование, СсылкаИлиТип", Ложь));

Возврат Результат;

КонецФункции

// Добавляет в оповещение для динамических списков типы из массива измененных объектов.

// Параметры:

// ИзмененныеОбъекты (Массив) из (*) Ссылки измененных объектов программы.

// Результат (Структура) См. СтандартныеПодсистемыКлиент.ПоказатьРезультатВыполнения().

//

Процедура ПодготовитьОповещениеДинамическихСписков(Знач ИзмененныеОбъекты, Результат) Экспорт

Если ТипЗнч(ИзмененныеОбъекты) <> Тип("Массив") ИЛИ ИзмененныеОбъекты.Количество() = 0 Тогда

Возврат;

КонецЕсли;

Оповещение = Результат.ОповещениеДинамическихСписков;

Оповещение.Использование = Истина;

ЗначениеОповещения = Оповещение.СсылкаИлиТип;

ЗначениеОповещенияЗаполнено = ЗначениеЗаполнено(ЗначениеОповещения);

Если ИзмененныеОбъекты.Количество() = 1 И НЕ ЗначениеОповещенияЗаполнено Тогда

Оповещение.СсылкаИлиТип = ИзмененныеОбъекты[0];

Иначе

// Преобразование оповещения в массив.

ЗначениеОповещенияТип = ТипЗнч(ЗначениеОповещения);

Если ЗначениеОповещенияТип <> Тип("Массив") Тогда

Оповещение.СсылкаИлиТип = Новый Массив;

Если ЗначениеОповещенияЗаполнено Тогда

Оповещение.СсылкаИлиТип.Добавить(?(ЗначениеОповещенияТип = Тип("Тип"), ЗначениеОповещения, ЗначениеОповещенияТип));

КонецЕсли;

КонецЕсли;

// Добавление типов измененных объектов.

Для Каждого ИзмененныйОбъект Из ИзмененныеОбъекты Цикл

ТипИзмененногоОбъекта = ТипЗнч(ИзмененныйОбъект);

Если Оповещение.СсылкаИлиТип.Найти(ТипИзмененногоОбъекта) = Неопределено Тогда

Оповещение.СсылкаИлиТип.Добавить(ТипИзмененногоОбъекта);

КонецЕсли;

КонецЦикла;

КонецЕсли;

КонецПроцедуры

Движения документа «Приходная накладная»

//Регистр СтоимостьМатериалов Приход

Движение = Движения.СтоимостьМатериалов.Добавить();

Движение.ВидДвижения = ВидДвиженияНакопления.Приход;

Движение.Период = Дата;

Движение.Материал = ТекСтрокаМатериалы.Материал;

Движение.Стоимость = ТекСтрокаМатериалы.Сумма;