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