Вопрос о том, имеет ли право документ изменять данные непосредственно в справочнике при своем проведении, является фундаментальным для архитектуры системы «1С:Предприятие». На первый взгляд может показаться, что перезапись реквизита справочника (например, смена организации-владельца у лицензии или смена ответственного в карточке основного средства) — это самый простой и короткий путь. Однако такой подход порождает цепочку критических проблем, которые со временем разрушают целостность базы данных. Разберем подробно, почему так делать нельзя и как реализовать задачу корректно с точки зрения методологии фирмы «1С».
Рассмотрим ситуацию, в которой программист решил обновлять поле Организация в справочнике Лицензии при проведении документа передачи. На первый взгляд, все работает: открываем карточку лицензии и видим актуального владельца. Но давайте проанализируем последствия, с которыми столкнется система в процессе эксплуатации.
Вместо хранения переменной информации (владелец, состояние, местонахождение) в самом справочнике, проанализируем использование Периодического регистра сведений. Справочник в данном случае должен содержать только условно-постоянную информацию: серийный номер, название продукта, дату выпуска. Все, что меняется во времени, должно выноситься в регистр.
Рассмотрим алгоритм реализации через Регистр сведений МестонахождениеЛицензий:
В пределах секунды).Подчинение регистратору. Это обеспечит жесткую связь записи регистра с документом.Лицензия (тип СправочникСсылка.Лицензии), в качестве ресурса — Организация (тип СправочникСсылка.Организации).Теперь при проведении документа нам не нужно трогать справочник. Документ просто создает запись в регистре. Разберем пример кода в модуле проведения документа:
Процедура ОбработкаПроведения(Отказ, Режим)
// Очищаем старые движения
Движения.МестонахождениеЛицензий.Записывать = Истина;
Движения.МестонахождениеЛицензий.Очистить();
Для Каждого СтрокаТЧ Из ТабличнаяЧастьЛицензии Цикл
НоваяЗапись = Движения.МестонахождениеЛицензий.Добавить();
НоваяЗапись.Период = Дата;
НоваяЗапись.Лицензия = СтрокаТЧ.Лицензия;
НоваяЗапись.Организация = ОрганизацияПолучатель;
КонецЦикла;
КонецПроцедуры
Выясним причину, по которой программисты часто тяготеют к изменению справочника: это удобство вывода данных в списках и подборах. Если реквизит есть в справочнике, его легко вытащить в список. Но современные управляемые формы позволяют делать это гораздо изящнее без ущерба для архитектуры.
Проанализируем способы получения текущего владельца:
Лицензии мы можем изменить основной запрос, добавив левое соединение с виртуальной таблицей СрезПоследних нашего регистра сведений. Пользователь даже не заметит разницы: в колонке «Организация» всегда будет отображаться актуальный владелец на текущую дату.РегистрыСведений.МестонахождениеЛицензий.СрезПоследних() при открытии. Это гарантирует, что пользователь видит правду, а данные при этом защищены от случайной порчи при перепроведении документов.Если ваша задача подразумевает не просто отслеживание «где сейчас лицензия», но и контроль количества (например, у нас есть 100 лицензий на рабочие места, и мы распределяем их по частям), рассмотрим использование Регистра накопления.
Регистр накопления позволит:
Пример структуры регистра накопления ОстаткиЛицензий (вид — Остатки):
Организация, ТипЛицензии (или ссылка на справочник).Количество.При передаче лицензии документ сделает две записи: Расход по Организации-отправителю и Приход по Организации-получателю. Это классическая схема балансового учета, принятая в 1С.
Подведем итог: изменение справочника документом — это технический долг, который «выстрелит» в будущем при первой же необходимости исправить документы прошлых периодов.
Рассмотрим краткий чек-лист при проектировании:
Если вы столкнулись с утверждением, что «так проще делать подборы», помните: в 1С 8.3 механизм ДинамическийСписок позволяет соединять любые таблицы. Потратив лишние 10 минут на настройку запроса в форме списка, вы сэкономите часы и дни на исправлении ошибок учета в будущем. Правильное программирование в 1С — это всегда работа через регистры, которые обеспечивают историю, параллельность и надежность данных.