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