- •Введение
- •2 Системный проект
- •2.1 Проектирование интерфейса
- •2.2 Используемые компоненты (структура метаданных)
- •2.3 Описание входных и выходных данных
- •3. Технический проект
- •3.1. Выбор и обоснование состава технических и программных средств
- •Физическая структура программы
- •4. Экономическая часть
- •5. Экспериментальная часть
- •6. Охрана труда
- •Заключение
- •Список использованной литературы
- •Тексты процедуры
Заключение
В ходе дипломной работы мной была написана (ты только писала???????????????) программа для учета услуг в фотосалоне в системе 1С предприятие. Все поставленные цели были достигнуты. Программа производит учет услуг, хранит документы и данные, необходимые для создания и учета услуг.
Так же имеется возможность расчета прибыли и автоматической наценки.
В заключение можно сказать о том, что разработка приложений не остановится на разработанном приложении (масло масляное). Ведь технологии и условия предоставления услуг не стоят на месте.
Во время написания дипломной работы, мной было получено множество теоретических и практических знаний, в области разработки автоматизированных рабочих мест, а так же в области
Список использованной литературы
http://www.interface.ru
М.Г. Радченко «1С: Предприятие. Практическое пособие для разработчиков» ООО «1С-Паблишинг», СПб:Питер, 2007 г.
«1С: Предприятие. Руководство разработчика прикладных решений» ООО «1С-Паблишинг» Москва, Фирма «1С», 2009 г.
Н.Н. Карпухина «Экономические информационные системы: Разработка прикладного решения средствами 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];
Иначе
// Преобразование оповещения в массив.
ЗначениеОповещенияТип = ТипЗнч(ЗначениеОповещения);
Если ЗначениеОповещенияТип <> Тип("Массив") Тогда
Оповещение.СсылкаИлиТип = Новый Массив;
Если ЗначениеОповещенияЗаполнено Тогда
Оповещение.СсылкаИлиТип.Добавить(?(ЗначениеОповещенияТип = Тип("Тип"), ЗначениеОповещения, ЗначениеОповещенияТип));
КонецЕсли;
КонецЕсли;
// Добавление типов измененных объектов.
Для Каждого ИзмененныйОбъект Из ИзмененныеОбъекты Цикл
ТипИзмененногоОбъекта = ТипЗнч(ИзмененныйОбъект);
Если Оповещение.СсылкаИлиТип.Найти(ТипИзмененногоОбъекта) = Неопределено Тогда
Оповещение.СсылкаИлиТип.Добавить(ТипИзмененногоОбъекта);
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Движения документа «Приходная накладная»
//Регистр СтоимостьМатериалов Приход
Движение = Движения.СтоимостьМатериалов.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Дата;
Движение.Материал = ТекСтрокаМатериалы.Материал;
Движение.Стоимость = ТекСтрокаМатериалы.Сумма;
