Добрый день, кого заинтересовало.
Накопилось конечно много за годы работы, но вот решил начать с простого.
Понадобилось клиенту в шаблон чека вставлять текст различный. Я предложил ему свое виденье и вот что получилось.
Добавил регистр сведений периодический в день с измерением магазин(справочник.магазин) и ресурсом текстовым(Праздник).
Еще реквизит создатель(справочник.пользователи) для удобства разбора полетов.
В Сервис добавил строчку для вызова формы списка регистра сведений.
На форме добавил кнопочку акция для вызова формы, которое облегчает занесение данных в регистр. Не руками ж нам все это вбивать
вбиваем период вручную, или с помощью кнопки период.
Текст акции. и список магазинов. Можно через подбор наколотить.
Затем жмакаем на кнопку создать акцию и проставляются строки в регистре.
Вообще-то реализован пакетный ввод, то есть можно открыть форму и нажать создать акцию, система сама предложит заполнить нужную информацию.
КОД:
Процедура ПериодНажатие()
НастройкаПериода = новый НастройкаПериода;
НастройкаПериода.УстановитьПериод(НачалоАкции, ?(КонецАкции = '0001-01-01', КонецАкции, КонецДня(КонецАкции)));
НастройкаПериода.РедактироватьКакИнтервал = Истина;
НастройкаПериода.РедактироватьКакПериод = Истина;
НастройкаПериода.ВариантНастройки = ВариантНастройкиПериода.Период;
Если НастройкаПериода.Редактировать() Тогда
НачалоАкции = НастройкаПериода.ПолучитьДатуНачала();
КонецАкции = НастройкаПериода.ПолучитьДатуОкончания();
КонецЕсли;
КонецПроцедуры
Процедура НачалоАкцииПриИзменении(Элемент)
Если КонецАкции = '00010101' или КонецАкции
НачалоАкции = НачалоДня(НачалоАкции);
КонецАкции = НачалоДня(НачалоАкции);
Иначе
НачалоАкции = НачалоДня(НачалоАкции);
КонецЕсли;
КонецПроцедуры
Процедура СоздатьАкциюЕКНажатие(Элемент)
создаем = Ложь;
Если Стрдлина(сокрлп(праздник)) = 0 тогда
Предупреждение("Текст АКЦИИ не введен!");
иначе
если Магазины.Количество() = 0 тогда
Ответ = КодВозвратаДиалога.Да;
Режим = РежимДиалогаВопрос.ДаНет;
пока Ответ = КодВозвратаДиалога.да цикл
формамагазинов = Справочники.Магазины.ПолучитьФормуВыбора();
ВыбралиМагазин = формамагазинов.ОткрытьМодально();
Если ВыбралиМагазин = Неопределено Тогда
Текст = "ru = ""Нажмите на магазин два раза для выбора! Попробуете еще раз?"";"
+ " en = ""Do you want to continue?""";
Иначе
Магазины.Добавить(ВыбралиМагазин);
Текст = "ru = ""добавить еще магазин?"";"
+ " en = ""Do you want to continue?""";
КонецЕсли;
Ответ = Вопрос(НСтр(Текст), Режим, 0);
конецЦикла;
создаем = ?(Магазины.Количество() = 0, Ложь, Истина);
Иначе
создаем = Истина;
конецесли;
Если НачалоАкции <> '00010101' и КонецАкции <> '00010101' then
else
Сообщить("Выберите период!");
ПериодНажатие();
КонецЕсли;
Если НачалоАкции <> '00010101' и КонецАкции <> '00010101' then
else
Сообщить("Период не выбран!");
создаем = Ложь;
КонецЕсли;
Если создаем Тогда
Если год(КонецАкции) > Год(НачалоАкции) Тогда
ДнейВАкции = ДеньГода(КонецАкции) - ДеньГода(НачалоАкции) + (ДеньГода(КонецГода(КонецАкции)));
Иначе
ДнейВАкции = ДеньГода(КонецАкции) - ДеньГода(НачалоАкции);
КонецЕСли;
//Для Строка=1 по магазины.количество() Цикл
Для каждого Магазин из магазины.ВыгрузитьЗначения() Цикл
Для ДатаАкции = 0 по ДнейВАкции Цикл
ДеньАкции = НачалоАкции + ДатаАкции * 24 * 60 * 60;
Акции = РегистрыСведений.ПраздниковИАкций;
НаборЗнач = Акции.СоздатьНаборЗаписей();
НаборЗнач.Отбор.Период.Установить(ДеньАкции, Истина);
НаборЗнач.Отбор.Магазин.Установить(Магазин, Истина);
НаборЗнач.Прочитать();
Если НаборЗнач.Количество() = 0 Тогда
Запись = НаборЗнач.Добавить();
запись.Магазин = Магазин;
запись.Праздник = Праздник;
запись.Период = ДеньАкции;
запись.Создатель = ПараметрыСеанса.ТекущийПользователь;
ИначеЕсли НаборЗнач.Количество() = 1 Тогда
//Запись = НаборЗнач[0];
//запись.Праздник = Праздник;
//запись.Создатель = ПараметрыСеанса.ТекущийПользователь;
НаборЗнач[0].Праздник = Праздник;
НаборЗнач[0].Создатель = ПараметрыСеанса.ТекущийПользователь;
КонецЕсли;
НаборЗнач.Записать(Истина);
НаборЗнач.Очистить();
КонецЦикла;
КонецЦикла;
Иначе
Сообщить("Не все так гладко, проверьте данные.");
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Процедура УдалитьНажатие(Элемент)
создаем = Ложь;
Если сокрлп(праздник) = 0 тогда
сообщить("Поле АКЦИЯ пусто!");
иначе
если Магазины.Количество() = 0 тогда
Ответ = КодВозвратаДиалога.Да;
Режим = РежимДиалогаВопрос.ДаНет;
пока Ответ = КодВозвратаДиалога.да цикл
формамагазинов = Справочники.Магазины.ПолучитьФормуВыбора();
ВыбралиМагазин = формамагазинов.ОткрытьМодально();
Если ВыбралиМагазин = Неопределено Тогда
Текст = "ru = ""Нажмите на магазин два раза для выбора! Попробуете еще раз?"";"
+ " en = ""Do you want to continue?""";
Иначе
Магазины.Добавить(ВыбралиМагазин);
Текст = "ru = ""добавить еще магазин?"";"
+ " en = ""Do you want to continue?""";
КонецЕсли;
Ответ = Вопрос(НСтр(Текст), Режим, 0);
конецЦикла;
создаем = ?(Магазины.Количество() = 0, Ложь, Истина);
Иначе
создаем = Истина;
конецесли;
КонецЕсли;
Если НачалоАкции <> '00010101' и КонецАкции <> '00010101' then
else
Сообщить("Выберите период!");
ПериодНажатие();
КонецЕсли;
Если НачалоАкции <> '00010101' и КонецАкции <> '00010101' then
else
Сообщить("Период не выбран!");
создаем = Ложь;
КонецЕсли;
Если создаем Тогда
Если КонецАкции ДнейВАкции = ДеньГода(КонецАкции) - ДеньГода(НачалоАкции) + (ДеньГода(КонецГода(КонецАкции)));
Иначе
ДнейВАкции = ДеньГода(КонецАкции) - ДеньГода(НачалоАкции);
КонецЕСли;
//Для Строка=1 по магазины.количество() Цикл
Для каждого Магазин из магазины.ВыгрузитьЗначения() Цикл
Для ДатаАкции = 0 по ДнейВАкции Цикл
ДеньАкции = НачалоАкции + ДатаАкции * 24 * 60 * 60;
Акции = РегистрыСведений.ПраздниковИАкций;
НаборЗнач = Акции.СоздатьНаборЗаписей();
НаборЗнач.Отбор.Период.Установить(ДеньАкции, Истина);
НаборЗнач.Отбор.Магазин.Установить(Магазин, Истина);
НаборЗнач.Прочитать();
Если НаборЗнач.Количество() = 1 Тогда
НаборЗнач.Удалить(0);
НаборЗнач.Записать(истина);
ИначеЕсли НаборЗнач.Количество() > 1 Тогда
Для индекс = 0 по НаборЗнач.Количество() Цикл
НаборЗнач.Удалить(индекс);
КонецЦикла;
НаборЗнач.Записать(истина);
КонецЕсли;
НаборЗнач.Очистить();
КонецЦикла;
КонецЦикла;
Иначе
Сообщить("Не все так гладко, проверьте данные.");
КонецЕсли;
КонецПроцедуры
Также реализовано удаление записей по магазину и периоду.
Для перезаписи достаточно указать новое наименование акции период/магазин и нажать создать.
Затем в ЧекККМ при записи создаем код смотрим новый ли это документ и заносим отталкиваясь от даты документа его строчку.
Если не этотобъект.проведен Тогда
Акции = РегистрыСведений.ПраздниковИАкций;
НаборЗнач = Акции.СоздатьНаборЗаписей();
НаборЗнач.Отбор.Период.Установить(НачалоДня(этотобъект.дата), Истина);
НаборЗнач.Отбор.Магазин.Установить(этотобъект.Магазин, Истина);
НаборЗнач.Прочитать();
Если НаборЗнач.Количество() = 1 Тогда
этотобъект.Комментарий = НаборЗнач[0].праздник;
КонецЕсли;
КонецЕсли;