1С: Предприятие — Как напечатать адреса для конвертов

    image

    Всем, кто ведет свои дела официально, знакома такая рутинная операция, как отправка счетов и актов контрагентам. И с увеличением количества партнеров Вашего бизнеса, операция становится все неприятнее.

    Чтобы рутинный труд стал приятнее, нужно его автоматизировать!

    В этой статье я расскажу как делал обработку для «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

    Успешного Вам ведения дел!

    Similar posts

    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 17

      +3
      наконец-то тут начали писать и про 1с.
        0
        Это сарказм?
          +3
          нет конечно. Я сам 1с-ик и таким вещам могу только радоваться
        +2
        Респект тебе и уважуха. Будем надеяться поезд тронулся.
          0
          зачем это? (не печать вложения в конверт с адресом, а простейший пример внешней печ. формы, который гуглится при необходимости в 1 минуту)?
            0
            Видимо было лучше написать 3х этажный запрос. А то что тут пишут как в PHP строку вывести это считается нормально.
              –1
              ну, ИМХО здесь было бы уместно написать про разворачивание сервера 1с (можно и под линукс), связку с апачем/иис и т.п.
                0
                А почему минусанули? Серевер 1С под линукс нормально так работает, если еще и DB2 в качестве сервера БД то вообще красота, производительность сравнима с MSSQL+Win2K3.
                С клиентом только проблемы, только под Wine, и хаспами заморочки.
                  0
                  если использовать сетевой ключ — то с хаспами проблем нет
            0
            А вообще видимо спешил когда пост писал. Не написал как сделать параметры (ИндексПолучателя, АдресПолучателя и т.д.) Они если делать по твоему описанию просто текст. Но все равно молодец.
              0
              Не-не-не.

              Все написано:

              Чтобы в ячейки созданного макета можно было записывать значения, нужно в свойствах ячейки, в разделе Макет в Заполнении выбрать Параметр, а в Параметр написать название. У меня это НаименованиеПолучателя, АдресПолучателя и ИндексПолучателя (см. скриншот с макетом).
              0
              к этому ещё можно добавить про авторегистрацию формы. а в целом достаточно внятно написано!
                0
                А поясните пожалуйста, что вы имеете в виду под авторегистрацией формы?
                  +1
                  это когда Появится вопрос «Указанная внешняя печатная форма содержит параметры авторегистрации. Использовать их?» жмите ДА
                    0
                    Ага, видимо вы подразумеваете вот это: Внешняя печатная форма так же может иметь в своем составе макет «Параметры_Авторегистрации», используемый для автоматического заполнения принадлежности печатной формы в справочнике «Внешние обработки» состоящий из 2-х колонок – «полное имя метаданного» и «имя табличной части».

                    Спасибо за наводку, никогда раньше авторегистрацией не пользовалась.
                      0
                      ага. Пользуйтесь! очень удобно!
                0
                листинги на русском на хабре =\

                Only users with full accounts can post comments. Log in, please.