"Внешний" справочник или Хранение данных между сеансами работы внешних обработок


Часто встает задача хранения неких данных между сеансами работы с внешними обработками или печатными формами, а конфигурация находится на поддержке. Хранить на жестком диске в файлах? Нее...

Поискав интересующую информацию на Инфостарте, пришел к выводу, что, конечно, тема эта поднималась неоднократно, но как-то все решения оставли впечатление незавершенности. Вы можете сказать, что это баян, но это Ваше право.

Итак, имеем некую, например, внешнюю печатную форму, в которой надо выводить автомобиль с дополнительными реквизитами. Справочника "Автомобили" в конфигурации нет (и действительно, зачем он в бухгалтерии сдался?), конфигурация находится на поддержке и ради одного лишнего справочника лишать ее такого статуса неохота.

Вывод напрашивается сам собой: "А пусть пользователь перед печатью ручками вобьет в специальную форму необходимые данные!".

Вывод правильный, и, в принципе, единственный. НО! Если пользователь печатает такую форму раз в год, на этом можно остановиться. А если 50 раз в день? Встает вопрос, где хранить введенные пользователем данные для возможности их использования в дальнейшем.

По большому счету, вменяемых вариантов только два:

    1) внешний файл на жестком диске;

    2) регистр сведений "Сохраненные настройки".

Первый вариант отметаю сразу, так как, поскольку файл лежит на диске, пользователь вполне может его удалить (неосторожно или умышленно). Плюс ко всему, при переносе базы физически в другое место (в файловом варианте) необходимо позаботится о том, чтобы и с нового места программа "видела" файл. Как по мне, это неудобно.

По поводу второго варианта, Вы можете сказать, что этот регистр предназначен вовсе не для этого, однако, посмотрев на его структуру, видим, что типы измерений и ресурсов - строки, хранилище значения и булево. Так почему бы и нет? Ах да, еще одно измерение - пользователь, для которого сохраняются данные.

По поводу пользователя здесь, на Инфостарте, встречал сетования, что данные сохраняются только для конкретного пользователя. Это не так, можно сохранить и для всех пользователей. Об этом далее.

Итак, в качестве "места дислокации" внешнего справочника выбираем регистр сведений "Сохраненные настройки", который есть практически во всех типовых конфигурациях.

Реализация проста до безобразия: 

    - создаем таблицу значений с некоторым набором колонок (это описание реквизитов "внешнего" справочника);

    - добавляем в таблицу строки (это "элементы" справочника);

    - кладем таблицу в структуру и создаем из нее хранилище значения;

    - добавляем запись в регистр сведений.

Можно напрямую создать хранилище значения из таблицы, но я предпочитаю структуру, так как кроме самой таблицы в ней можно сохранить и значения других реквизитов обработки.

Далее алгоритм следующий:

    - при открытии формы считываем сохраненную структуру

    - извлекаем таблицу значений и заполняем табличную часть обработки

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

    - при закрытии выгружаем табличную часть, ложим в структуру и записываем в регистр.

Для того, чтобы все пользователи могли воспользоваться данным "справочником" в измерение регистра "Пользователь" пишем предопределенный элемент справочника "Группы пользователей" - "Все пользователи".

Конечно, не обойтись и без минусов.

Если несколько пользователей одновременно редактируют "внешний" справочник, то запишутся изменения того, кто последний нажал кнопку "Сохранить".

Если в "реквизитах" такого справочника используются значения ссылочного типа (справочники, документы и т.п.), стоит помнить, что при проверке возможности удаления объектов игнорируется факт того, что эти элементы присутствуют в хранилище значения. Соответственно после удаления объектов мы можем получить.

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

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

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

А если далее развить эту тему, то можно в хранилище значения ложить массив структур, каждая из которых описывает "элемент" справочника. Таким образом можно хранить более сложные элементы - с кучей реквизитов и табличных частей. Но это совсем другая история... :)

Файлы обработки:

-