Срок поставки в счёте покупателю (БП 3.0)
В работе часто нужно показать покупателю срок поставки прямо в счёте — по строкам, а не одной фразой в комментарии. Предлагаю расширение для «1С:Бухгалтерии предприятия» 3.0: справочник сроков, колонка в счёте и отдельный бланк печати/отправки.
К публикации прилагается файл расширения .cfe (имя в конфигураторе: СрокПоставкиСчета, префикс СрокПоставки_).
Типовую конфигурацию не трогаем: документ СчетНаОплатуПокупателю заимствован, реквизит добавлен в ТЧ «Товары». Типовые печать и отправка счёта остаются как были — для покупателя со сроком есть отдельная команда. Расширение рассчитано на сопровождение в том числе в 1С:Фреш.
В решении: один справочник, константа-флаг стартового набора, свой макет и роли. Команды печати и отправки подключаются через &После, без замены типовых процедур.
Для печати берём типовой табличный документ счёта и вставляем колонку «Срок поставки» сразу после наименования. Так бланк остаётся близок к привычному счёту, а типовой макет поставщика не меняется.
Общая настройка
- Загрузить расширение в конфигуратор и подключить его.
- Роли:
СрокПоставки_ОсновнаяРоль— выбор срока в счёте (оформителям);СрокПоставки_ДобавлениеИзменениеСроков— ведение справочника (администратору или ответственному);- для администраторов с полными правами заимствована донастройка
ПолныеПрава.
- Справочник «Срок поставки» появляется в подсистеме «Продажи».
- При первом открытии счёта (или после обновления ИБ) один раз создаётся стартовый набор из семи значений.


Пример для справочника сроков
Нужен общий список формулировок, чтобы менеджеры не писали срок «как получится». При подключении создаём семь обычных элементов; дальше список правят сами.
Процедура ОбеспечитьСтартовыйНабор() Экспорт
Если Константы.СрокПоставки_СтартовыйНаборЗагружен.Получить() Тогда
Возврат;
КонецЕсли;
УстановитьПривилегированныйРежим(Истина);
Наименования = Новый Массив;
Наименования.Добавить(НСтр("ru = 'В наличии'"));
Наименования.Добавить(НСтр("ru = '5 дней'"));
Наименования.Добавить(НСтр("ru = '10 дней'"));
Наименования.Добавить(НСтр("ru = '30 дней'"));
Наименования.Добавить(НСтр("ru = '45 дней'"));
Наименования.Добавить(НСтр("ru = '60 дней'"));
Наименования.Добавить(НСтр("ru = 'По согласованию'"));
Для Каждого НаименованиеЭлемента Из Наименования Цикл
ЭлементОбъект = Справочники.СрокПоставки_СрокиПоставки.СоздатьЭлемент();
ЭлементОбъект.Наименование = НаименованиеЭлемента;
ЭлементОбъект.Записать();
КонецЦикла;
Константы.СрокПоставки_СтартовыйНаборЗагружен.Установить(Истина);
УстановитьПривилегированныйРежим(Ложь);
КонецПроцедуры
Вызов после обновления ИБ:
&После("ПослеОбновленияИнформационнойБазы")
Процедура СрокПоставки_ПослеОбновленияИнформационнойБазы(Знач ПредыдущаяВерсияИБ, Знач ТекущаяВерсияИБ,
Знач ИтерацииОбновления, ВыводитьОписаниеОбновлений, Знач МонопольныйРежим) Экспорт
СрокПоставки_Обновление.ОбеспечитьСтартовыйНабор();
КонецПроцедуры
Дубликаты по наименованию (без учёта регистра) не сохраняем:
Процедура ПередЗаписью(Отказ)
Если ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| СрокиПоставки.Ссылка КАК Ссылка
|ИЗ
| Справочник.СрокПоставки_СрокиПоставки КАК СрокиПоставки
|ГДЕ
| ВРЕГ(СрокиПоставки.Наименование) = ВРЕГ(&Наименование)
| И СрокиПоставки.Ссылка <> &Ссылка";
Запрос.УстановитьПараметр("Наименование", Наименование);
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Если Не Запрос.Выполнить().Пустой() Тогда
Отказ = Истина;
ОбщегоНазначения.СообщитьПользователю(
НСтр("ru = 'Наименование уже используется'"),
ЭтотОбъект,
"Наименование",
,
Отказ);
КонецЕсли;
КонецПроцедуры
Проверка: открыть e1cib/list/Справочник.СрокПоставки_СрокиПоставки под ответственным — семь значений на месте; под оформителем запись нового элемента не проходит.

[СКРИН: отказ при дубликате «5 Дней»]
Пример для колонки в счёте
В Документ.СчетНаОплатуПокупателю в ТЧ «Товары» добавлен реквизит СрокПоставки_Срок (ссылка на справочник). На форме документа колонка стоит сразу после наименования — как на печати.
Стартовый набор дополнительно подстраховываем при открытии формы:
&НаСервере
&После("ПриСозданииНаСервере")
Процедура СрокПоставки_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
СрокПоставки_Обновление.ОбеспечитьСтартовыйНабор();
КонецПроцедуры
Заполнение срока не обязательно: пустая ячейка записывается. При копировании счёта сроки уходят в копию вместе со строками.
Проверка: открыть счёт покупателю, выбрать разные сроки в нескольких строках, записать и открыть снова.

Пример для печати и отправки
Типовой СчетЗаказ не меняем. Добавляем свою команду через &После:
&После("ДобавитьКомандыПечати")
Процедура СрокПоставки_ДобавитьКомандыПечати(КомандыПечати) Экспорт
КомандаПечати = КомандыПечати.Добавить();
КомандаПечати.МенеджерПечати = "СрокПоставки_Печать";
КомандаПечати.Идентификатор = "СрокПоставки_СчетЗаказ";
КомандаПечати.Представление = НСтр("ru = 'Счет на оплату (со сроком поставки)'");
КомандаПечати.Порядок = 15;
КонецПроцедуры
&После("ДобавитьКомандыОтправки")
Процедура СрокПоставки_ДобавитьКомандыОтправки(КомандыОтправки) Экспорт
КомандаОтправки = КомандыОтправки.Добавить();
КомандаОтправки.МенеджерПечати = "СрокПоставки_Печать";
КомандаОтправки.Идентификатор = "СрокПоставки_СчетЗаказ";
КомандаОтправки.Представление = НСтр("ru = 'Счет на оплату (со сроком поставки)'");
КомандаОтправки.Порядок = 15;
КонецПроцедуры
Формирование бланка: типовая печать счёта, затем вставка колонки по данным ТЧ:
Процедура Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
Если Не УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "СрокПоставки_СчетЗаказ") Тогда
Возврат;
КонецЕсли;
ТаблицаСведений = Документы.СчетНаОплатуПокупателю.ПолучитьТаблицуСведенийСчетаНаОплату(МассивОбъектов);
СрокиПоСтрокам = СрокПоставки_СрокиПоСтрокамДокументов(МассивОбъектов);
ТабличныйДокумент = ПечатьТорговыхДокументов.ПечатьСчетаНаОплату(ТаблицаСведений, ОбъектыПечати, ПараметрыПечати);
СрокПоставки_ДополнитьКолонкойСрока(ТабличныйДокумент, ТаблицаСведений, СрокиПоСтрокам);
УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(
КоллекцияПечатныхФорм,
"СрокПоставки_СчетЗаказ",
НСтр("ru = 'Счет на оплату (со сроком поставки)'"),
ТабличныйДокумент,
,
"ОбщийМакет.СрокПоставки_ПФ_MXL_СчетЗаказ");
КонецПроцедуры
Проверка: из записанного счёта вызвать «Счет на оплату (со сроком поставки)» — колонка после наименования; типовая печать и типовая отправка без этой колонки.


Альтернатива
Альтернативой может быть правка типового макета ПФ_MXL_СчетЗаказ и типовой формы счёта в конфигурации поставщика. Но тогда каждое обновление БП — ручное сравнение.
Второй вариант — внешняя печатная форма без реквизита в документе. Тогда срок не хранится в строке счёта и не копируется вместе с документом.
Важные дополнения
- Оформителям достаточно основной роли расширения; править справочник без роли
СрокПоставки_ДобавлениеИзменениеСроковнельзя. - Если все элементы справочника удалили — колонка в счёте остаётся, выбирать нечего; стартовая семёрка сама не вернётся (константа уже установлена).
- Помеченный на удаление срок в новом выборе не предлагается; в уже записанных строках старое значение видно.
Проверено на следующих конфигурациях и релизах:
- Бухгалтерия предприятия, редакция 3.0, релизы 3.0.195.36
Вступайте в нашу телеграмм-группу Инфостарт