Мы сталкиваемся с распространенной задачей в 1С:УТ 11 – необходимо запретить печать документов отгрузки, таких как товарные накладные (ТОРГ-12) или акты, если для соответствующего документа «Реализация товаров и услуг» не был создан «Счет-фактура выданный». Проблема часто возникает из-за человеческого фактора: менеджеры по продажам могут забыть выписать счет-фактуру, что приводит к нарушениям в учете НДС. Рассмотрим различные подходы к решению этой задачи, от модификации стандартных процедур печати до изменения логики проведения документов и управления видимостью элементов формы.
Основной вопрос, который возникает при такой задаче – где именно в конфигурации 1С лучше всего разместить логику проверки. Нам нужно найти «узкое место», куда обращаются все команды печати, чтобы не дублировать код в каждом отдельном макете или команде. Автор изначально обратил внимание на функцию СформироватьПечатныеФормы(ИменаМакетов, Отказ), но отметил отсутствие в ней прямой ссылки на документ «Реализация товаров и услуг». Давайте разберем, как получить нужную ссылку в этой функции.
В функции СформироватьПечатныеФормы, которая, как правило, находится в общем модуле, ответственном за формирование печатных форм, мы можем получить ссылки на печатаемые документы через параметр Параметры.ПараметрыПечати.ОбъектыПечати. Этот параметр представляет собой массив ссылок на те документы, для которых осуществляется печать.
МенеджерПечатиКлиентСервер или ПечатьДокументовУТ. Нам нужно найти серверную часть, где есть доступ к базе данных для выполнения запросов.СформироватьПечатныеФормы затруднено, рассмотрим другие подходы, описанные ниже.
Для Каждого ОбъектПечати Из Параметры.ПараметрыПечати.ОбъектыПечати Цикл
// ОбъектПечати здесь будет ссылкой на документ, например, РеализацияТоваровУслугСсылка
// Дальнейшую логику проверки выполняем для каждого такого объекта
КонецЦикла;
ДокументСсылка.РеализацияТоваровУслуг.
Функция СчетФактураСоздан(РеализацияСсылка)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| СчетФактураВыданный.Ссылка
|ИЗ
| Документ.СчетФактураВыданный КАК СчетФактураВыданный
|ГДЕ
| СчетФактураВыданный.ДокументОснование = &РеализацияСсылка";
Запрос.УстановитьПараметр("РеализацияСсылка", РеализацияСсылка);
Результат = Запрос.Выполнить().Выбрать();
Возврат Результат.Следующий();
КонецФункции
// Внутри цикла по ОбъектПечати:
Если ТипЗнч(ОбъектПечати) = Тип("ДокументСсылка.РеализацияТоваровУслуг") Тогда
Если НЕ СчетФактураСоздан(ОбъектПечати) Тогда
Параметры.Отказ = Истина; // Прерываем печать
Сообщить("Для документа реализации " + ОбъектПечати + " не создан счет-фактура. Печать запрещена.", СтатусСообщения.Важное);
Возврат; // Выходим из функции или цикла
КонецЕсли;
КонецЕсли;
Обратите внимание, что установка Параметры.Отказ = Истина в этой функции прервет печать всего комплекта документов, если хотя бы для одного документа в списке не выполнены условия.
Не всегда удобно или возможно изменять общие функции печати, особенно в случае типовых конфигураций и необходимости легкого обновления. Рассмотрим другие, возможно, более простые в реализации подходы.
Этот подход предполагает, что мы перехватываем событие нажатия на кнопку «Печать» непосредственно на форме документа «Реализация товаров и услуг». Это более локальный контроль, применимый только к текущему документу.
КомандаПечать, мы можем создать обработчик для нее на форме.
&НаКлиенте
Процедура КомандаПечать(Команда)
Если НЕ СчетФактураСозданНаСервере(Объект.Ссылка) Тогда
ПоказатьПредупреждение(,"Для текущего документа реализации не создан счет-фактура. Печать запрещена.");
Возврат;
КонецЕсли;
// Вызываем стандартную процедуру печати
// Например: ВыполнитьКомандуПечати(Команда.Имя);
// Или: ЭтаФорма.ВыполнитьКоманду("ПечатьКомплектДокументов");
КонецПроцедуры
&НаСервере
Функция СчетФактураСозданНаСервере(РеализацияСсылка)
// Здесь та же функция СчетФактураСоздан(РеализацияСсылка)
// из предыдущего раздела
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| СчетФактураВыданный.Ссылка
|ИЗ
| Документ.СчетФактураВыданный КАК СчетФактураВыданный
|ГДЕ
| СчетФактураВыданный.ДокументОснование = &РеализацияСсылка";
Запрос.УстановитьПараметр("РеализацияСсылка", РеализацияСсылка);
Результат = Запрос.Выполнить().Выбрать();
Возврат Результат.Следующий();
КонецФункции
Этот метод более гибок, так как позволяет управлять логикой для конкретной формы документа. Однако он не сработает, если печать запускается из списка документов или через другие команды, не связанные с данной формой.
Еще один подход – динамическое управление видимостью или доступностью кнопки «Печать» на форме документа «Реализация товаров и услуг». Это предотвращает саму возможность нажатия кнопки, пока условие не будет выполнено.
Кнопка, КоманднаяПанель, или Гиперссылка, связанная с командой.ПриСозданииНаСервере или ПриЧтенииНаСервере мы можем проверить наличие счета-фактуры и, при необходимости, изменить свойства кнопки.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ)
Если Объект.ЭтоНовый Тогда
// Для нового документа пока не скрываем, пользователь может сначала создать СФ
Возврат;
КонецЕсли;
Если НЕ СчетФактураСозданНаСервере(Объект.Ссылка) Тогда
// Находим элемент формы, связанный с кнопкой печати
// Например, у нас есть команда "ПечатьКомплектДокументов"
// и она выведена на форму
Элементы.КомандаПечатьКомплектДокументов.Доступность = Ложь;
// Или: Элементы.КомандаПечатьКомплектДокументов.Видимость = Ложь;
КонецЕсли;
КонецПроцедуры
// Дополнительно можно обновить доступность кнопки после создания СФ
// Например, в обработчике команды "СоздатьСФ"
&НаКлиенте
Процедура СоздатьСФ(Команда)
// ... стандартный код создания СФ
// После успешного создания СФ и записи документа
ОбновитьДоступностьКнопокПечати();
КонецПроцедуры
&НаСервере
Процедура ОбновитьДоступностьКнопокПечати()
Если СчетФактураСозданНаСервере(Объект.Ссылка) Тогда
Элементы.КомандаПечатьКомплектДокументов.Доступность = Истина;
КонецЕсли;
КонецПроцедуры
Этот метод обеспечивает более интуитивный интерфейс для пользователя, явно указывая, когда печать доступна. Однако он требует тщательного управления обновлением состояния кнопки (например, после создания счета-фактуры).
Хотя исходная задача была про запрет печати, корневая причина часто заключается в необходимости гарантировать создание счета-фактуры. Один из самых строгих подходов – это запрет проведения самой «Реализации товаров и услуг» без сформированного счета-фактуры. Это гарантирует, что в учете не появятся проведенные реализации, для которых НДС не будет отражен.
ОбработкаПроведения.
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
// ... стандартный код проведения ...
Если Не СчетФактураСоздан(Ссылка) Тогда // Используем Ссылка для текущего документа
Отказ = Истина;
Сообщить("Невозможно провести документ. Для данной реализации не создан счет-фактура.", СтатусСообщения.Важное);
Возврат;
КонецЕсли;
// ... продолжение стандартного кода проведения ...
КонецПроцедуры
Важный момент: Здесь возникает вопрос, который обсуждался на форуме: «как создать СФ по непроведенной РТУ? Первая же проверка скажет, что документ-основание должен быть проведен». Однако, на практике в 1С (как в БП, так и в УТ) счет-фактура может быть создан на основании непроведенной реализации. Проверка на проведенность документа-основания осуществляется позже, при попытке проведения самого счета-фактуры. То есть, последовательность может быть такой: создание реализации (без проведения) -> создание счета-фактуры на основании реализации -> проведение реализации (проверка наличия СФ) -> проведение счета-фактуры.
В ходе обсуждения возникла важная тема, касающаяся Универсального Передаточного Документа (УПД). Давайте подробнее рассмотрим, как УПД взаимодействует с «Реализацией товаров и услуг» и «Счетом-фактурой выданным» в 1С:УТ 11, поскольку это напрямую влияет на понимание задачи контроля печати.
В 1С:УТ 11 (и большинстве других конфигураций 1С) УПД не является отдельным видом документа в системе. Это критически важно для понимания. УПД – это печатная форма, которая может заменять собой сразу два документа: первичный документ отгрузки (например, ТОРГ-12) и счет-фактуру. Для полноценного отражения операции в учете (особенно в части НДС), даже если вы печатаете УПД, в системе 1С должны быть введены оба документа:
Без создания «Счета-фактуры выданного» в базе данных, даже если вы распечатаете УПД (который может получить номер из реализации), у вас не будет движения по регистрам НДС, и соответственно, не будет данных для формирования книги продаж. Система 1С, как правило, формирует УПД как печатную форму, объединяющую данные из этих двух документов.
На форуме обсуждался «выключатель» (флажок или переключатель), который якобы определяет, нужна ли СФ или УПД. Часто этот «выключатель» на самом деле определяет, какую печатную форму нужно вывести – комплект ТОРГ-12 + СФ, или единый УПД. Однако, наличие этого «выключателя» не отменяет необходимость создания «Счета-фактуры выданного» в базе 1С для корректного налогового учета, если организация является плательщиком НДС.
Если пользователи печатают УПД, полагая, что СФ при этом не нужна, а сам документ СФ в 1С не формируется, это ведет к серьезным учетным ошибкам. Поэтому крайне важно, чтобы документ «Счет-фактура выданный» всегда создавался, если по реализации необходимо отразить НДС, независимо от того, печатается ли отдельный СФ или УПД.
Чтобы избежать подобных проблем и устранить человеческий фактор, наиболее надежным решением является автоматическое создание или обновление счета-фактуры при проведении документа «Реализация товаров и услуг». Если в реализации есть строки с НДС, и СФ еще не создан, программа может создать его автоматически. Если СФ уже есть, но в реализации произошли изменения, программа может автоматически его обновить. Это позволяет:
При выборе и реализации одного из описанных подходов, а также при настройке работы с УПД, рекомендуем учитывать следующие моменты:
ОбработкаПроведения документа «Реализация товаров и услуг» или через регламентные задания, анализирующие непроведенные СФ по проведенным реализациям.ОбработкаПроведения или скрытие кнопки может быть нецелесообразным. В таком случае, возможно, стоит разрешить печать только специфической, «черновой» формы, не влияющей на учет.Выбор конкретного решения зависит от требований вашего бизнеса, сложности конфигурации и удобства поддержки. Важно тщательно продумать все сценарии использования и обеспечить корректное отражение всех операций в учете.