
Всем, кто ведет свои дела официально, знакома такая рутинная операция, как отправка счетов и актов контрагентам. И с увеличением количества партнеров Вашего бизнеса, операция становится все неприятнее.
Чтобы рутинный труд стал приятнее, нужно его автоматизировать!
В этой статье я расскажу как делал обработку для «1С: Предприятие 8» для печати адресов для конвертов. В своей работе я использую конфигурацию «1С: Упрощенка 8», поэтому все рассказанное будет относится к ней. Для рассылки документов используются конверты формата С5 с окошком (адрес печатается на обычном листе А4, который вкладывается в конверт).
Для нетерпеливых в конце поста есть ссылка на загрузку готовой обработки.
Создаем печатную форму
Запускаем 1С-ку в режиме конфигуратора и создаем новую Внешнюю обработку:

В открывшемся окне обработки кликаем правой кнопкой по Реквизитам и выбираем Добавить:

Вводим имя «СсылкаНаОбъект» и выбираем тип «СправочникСсылка.Контрагенты»:

Тут будет храниться ссылка на запись из справочника «Контрагенты», из которой будет извлекаться информация об адресе.
Следующий шаг — создание печатного макета. Правая кнопка мыши на Макет и выбираем Добавить. Нам нужен тип Табличный документ:

Вид макета зависит от вида и формата конверта, на котором вы будете печатать. Для С5 с окошком получается примерно так:

Закончив с макетом — выделяем строки для печати и делаем так:

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

В Исходном файле кликаем по кнопке Открыть и выбираем наш файл с обработкой.

В разделе Принадлежность печатной формы кликаем Добавить и в открывшемся окне на вкладке Справочники выбираем Контрагенты.

Жмем OK.
Все. Готово. Можно перевести дыхание. :)
Теперь, если открыть список контрагентов (Предприятие — Контрагенты) и зайти в любого из них, в правой нижней части окна появится кнопка для печати адресов. При клике на которую откроется окно, подобное этому:

Ее можно напечатать через меню Файл — Печать
Готовую обработку можно скачать тут: АдресДляКонвертаФИО.zip
Успешного Вам ведения дел!