В процессе работы с документами в 1С часто возникает ситуация, когда пользователь вносит изменения в реквизиты или табличную часть, но забывает нажать кнопку «Записать» перед тем, как вызвать команду печати или открыть обработку формирования печатных форм. В результате на печать выводятся старые данные, актуальные на момент последней записи в базу данных, что приводит к ошибкам в документообороте.
В этой статье мы разберем, как программно отследить изменения в документе и предложить пользователю сохранить данные перед выполнением дальнейших действий. Мы рассмотрим как стандартные возможности платформы «1С:Предприятие 8.3», так и механизмы «Библиотеки стандартных подсистем» (БСП), которая используется в большинстве современных типовых конфигураций.
Первое, на что стоит обратить внимание — это свойство управляемой формы Модифицированность. Данный флаг устанавливается платформой автоматически, как только пользователь меняет любое значение в форме, связанное с основным реквизитом (объектом). Рассмотрим, как работает этот механизм.
Проанализируем простую ситуацию: у нас есть самописная кнопка на форме, которая открывает внешнюю обработку или форму печати. Прежде чем выполнять основной код, мы должны проверить, не были ли внесены изменения. Сделать это можно следующим образом:
&НаКлиенте
Процедура КомандаПечать(Команда)
Если ЭтаФорма.Модифицированность Тогда
// Если флаг Истина, значит данные в форме отличаются от данных в базе
ТекстВопроса = "Данные документа были изменены. Записать документ перед печатью?";
ОписаниеОповещения = Новый ОписаниеОповещения("ПослеВопросаОЗаписи", ЭтотОбъект);
ПоказатьВопрос(ОписаниеОповещения, ТекстВопроса, РежимДиалогаВопрос.ДаНетОтмена);
Иначе
// Данные не менялись, можно печатать
ВыполнитьПечать();
КонецЕсли;
КонецПроцедуры
Разберем по шагам логику работы этого кода. Мы используем асинхронный метод ПоказатьВопрос, так как в современном интерфейсе «Такси» и веб-клиенте модальные окна заблокированы. В обработчике оповещения мы должны прописать логику записи:
&НаКлиенте
Процедура ПослеВопросаОЗаписи(Результат, ДополнительныеПараметры) Экспорт
Если Результат = КодВозвратаДиалога.Да Тогда
Если ЭтаФорма.Записать() Тогда
ВыполнитьПечать();
КонецЕсли;
ИначеЕсли Результат = КодВозвратаДиалога.Нет Тогда
// Пользователь отказался записывать, но хочет печатать старые данные
ВыполнитьПечать();
КонецЕсли;
// Если Отмена — ничего не делаем
КонецПроцедуры
Если ваша конфигурация построена на базе БСП (например, «Бухгалтерия предприятия 3.0», «Управление торговлей 11» или «ERP»), то задача значительно упрощается. Подсистема «Печать» уже содержит встроенные механизмы проверки модифицированности.
При добавлении команд печати в модуле менеджера объекта в процедуре ДобавитьКомандыПечати вы можете управлять поведением системы с помощью специальных параметров. Проанализируем основные флаги:
Истина, БСП сама проверит состояние формы и выведет диалог пользователю.Истина, система попытается автоматически записать объект перед печатью.Пример заполнения настроек команды в модуле менеджера:
Процедура ДобавитьКомандыПечати(КомандыПечати) Экспорт
Команда = КомандыПечати.Добавить();
Команда.Менеджер = "Документ.РеализацияТоваровУслуг";
Команда.Идентификатор = "СчетНаОплату";
Команда.Представление = НСтр("ru = 'Счет на оплату'");
Команда.ПроверкаМодифицированностиДанных = Истина; // Вот ключевой параметр
КонецПроцедуры
Выясним причину, почему использование штатных механизмов БСП предпочтительнее. Во-первых, это обеспечивает единообразие интерфейса: пользователь во всей программе видит одинаковые предупреждения. Во-вторых, БСП корректно обрабатывает ситуации с новыми (еще не созданными в базе) документами, для которых печать в принципе невозможна без получения ссылки (Ссылка).
Рассмотрим ситуацию, когда пользователь только что создал документ. В этом случае свойство Объект.Ссылка.Пустая() вернет Истина. Любая печатная форма, которая берет данные запросом из таблиц базы данных, вернет пустой результат, так как данных в SQL-таблицах еще нет — они находятся только в оперативной памяти формы.
Поэтому перед открытием обработки печати критически важно проверять не только Модифицированность, но и наличие ссылки. В типовых решениях попытка печати незаписанного объекта всегда принудительно инициирует процедуру записи. Если вы пишете свой механизм, обязательно добавьте проверку:
Если Объект.Ссылка.Пустая() Тогда
// Запись обязательна, иначе печать не сработает
Если НЕ ЭтаФорма.Записать() Тогда
Возврат; // Запись не удалась (например, не заполнены реквизиты)
КонецЕсли;
КонецЕсли;
Некоторые разработчики предпочитают более строгий подход к воспитанию пользователей: делать кнопку печати недоступной, если документ изменен. Для реализации такого поведения нам потребуется обработчик события ПриИзменении для всех значимых реквизитов или использование ожидания. Однако в платформе 1С нет прямого события ПриИзмененииМодифицированности.
Чтобы реализовать это, можно использовать обработчик ожидания, который проверяет флаг и меняет доступность кнопок, но это может негативно сказаться на производительности. Рассмотрим более изящный способ — использование Информационной панели. Мы можем выводить яркую надпись «Документ изменен, данные в печатной форме могут быть неактуальны», управляя видимостью этой декорации через свойство Модифицированность.
Если вы подключаете внешнюю печатную форму (ВПФ) через справочник «Дополнительные отчеты и обработки», обратите внимание на настройки регистрации. В функции СведенияОВнешнейОбработке() можно указать режим запуска. Если используется тип ВызовКлиентскогоМетода, вы сами контролируете запись. Если же используется ВызовСерверногоМетода, БСП берет контроль на себя.
Проанализируем пример настройки ВПФ для обеспечения записи:
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке();
НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
НоваяКоманда.Представление = "Печать с проверкой";
НоваяКоманда.Идентификатор = "ПроверкаЗаписи";
НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода();
// В этом режиме БСП сама предложит записать документ, если он изменен.
Для создания качественного интерфейса и предотвращения ошибок пользователей рекомендуем придерживаться следующих правил:
Модифицированность для проверки актуальности данных перед выводом на печать.ПроверкаМодифицированностиДанных).ПоказатьВопрос) для взаимодействия с пользователем, чтобы обеспечить работу в веб-клиенте.Соблюдение этих принципов позволит сделать работу пользователей более комфортной и застрахует бизнес от печати некорректных документов с устаревшими данными.