Когда-то давно передо мной была поставлена задача добавить в документ определенный реквизит и доработать процедуру заполнения табличных частей этого документа с отбором по этому реквизиту.
Казалось бы, задача для опытного (да и не очень опытного) 1С-ника простая, нужно всего лишь добавить реквизит, вывести его на форму, найти процедуру заполнения и доработать её.
Однако, в моем случае процедура заполнения документа вызывалась через типовой механизм "Длительные операции" или по-простому через механизм "Фоновых заданий", т.е. по нажатию на кнопку "Заполнить", программа заполняла структуру параметров и запускала фоновое задание из модуля менеджера документа с этими параметрами. Далее, вызывались нужные процедуры по заполнению таблиц документа. Однако, в эти процедуры передавалась не вся структура параметров (куда я мог поместить и свой в том числе), а лишь некоторые из них. Плюс к этому одним вызовом нужной процедуры дело не ограничивалось, до того, как параметры доходили до нужной процедуры заполнения они преодолевали тернистый путь из последовательного вызова 7-8 типовых процедур.
Иными словами, для такой "простейшей" задачи нужно было перелопачивать программный код (прописывать во все вызовы процедур наш дополнительный параметр), что потом бы неизбежно привело к проблемам с обновлениями.
Решено было создать простой регистр сведений, который был назван "ДополнительныеПараметрыПроцедурИФункций":
В результате чего алгоритм решения вышеописанной задачи свелся к следующему:
- Перед заполнением установить значение нужного нам параметра, записав его значение в регистр сведений
- В процедуре заполнения прочитать значение параметра из регистра
- Непосредственно доработать саму процедуру с учетом нашего параметра
Почему я для данного случая не использовал:
- Константы - не подходят для данного случая, так как параметры могут быть различными (у константы должно быть уникальное имя) и не постоянными (зависят, например, от значения реквизита конкретного документа)
- Параметры сеанса - данные параметры уникальны только в разрезе конкретного сеанса. Т.е. на примере выше, когда "поднимается" фоновое задание у него уже "свои" значения параметров сеанса
Процедуры чтения/записи значения параметров:
Процедура УстановитьЗначениеДопПараметраПроцедурИФункций(ИмяПараметра, ЗначениеПараметра) Экспорт
НаборЗаписей = РегистрыСведений.ДополнительныеПараметрыПроцедурИФункций.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.ИмяПараметра.Установить(ИмяПараметра);
НаборЗаписей.Прочитать();
НаборЗаписей.Очистить();
НоваяЗапись = НаборЗаписей.Добавить();
НоваяЗапись.ИмяПараметра = ИмяПараметра;
НоваяЗапись.ЗначениеПараметра = ЗначениеПараметра;
НаборЗаписей.Записать();
КонецПроцедуры
Функция ВернутьЗначениеДопПараметраПроцедурИФункций(ИмяПараметра) Экспорт
ЗначениеПараметра = Неопределено;
НаборЗаписей = РегистрыСведений.ДополнительныеПараметрыПроцедурИФункций.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.ИмяПараметра.Установить(ИмяПараметра);
НаборЗаписей.Прочитать();
Для каждого стр из НаборЗаписей Цикл
ЗначениеПараметра = стр.ЗначениеПараметра;
КонецЦикла;
Возврат ЗначениеПараметра;
КонецФункции
Данный регистр можно использовать не только так, как описано выше, но и как, например, хранение периодически изменяемых параметров, ради которых не хочется создавать в конфигурации константы.
В приложении к публикации находится простейшая конфигурация, демонстрирующая описанный выше механизм.