Бизнес. Финансы. Недвижимость. Страхование
Поиск по сайту

Печатные формы 1с 8.3 для чайников. Публикации. Подключение печатной формы к документу

Внешние печатные формы для обычного приложения (для конфигурация Бухгалтерия предприятия 2.0, Зарплата и управление персоналом 2.5, Управление торговлей 10.3 и т.д.) создаются довольно просто по сравнению с внешними печатными формами для управляемого приложения.

Для чего создавать внешние печатные формы

Преимущество внешней печатной формы по сравнению с обычной в том, что она позволяет избежать изменения конфигурации информационной базы. А это значит, что процесс последующего обновления конфигурации не будет усложнен. Кроме того, внешние печатные формы наряду с внешними обработками являются единственным вариантом расширения функционала базовых версий конфигураций 1С, которые нельзя изменять вообще.

Ну и последнее: внешние печатные формы легче тиражировать, т.к. они представляют собой отдельный файл, который можно быстро подключить к информационной базе.

Как создать внешнюю печатную форму

Рассмотрим процесс создания внешней печатной формы 1С по шагам:

  1. Создаем внешнюю обработку. Для этого в конфигураторе выбираем пункт меню Файл — Новый… И в открывшемся диалоговом окне — Внешняя обработка .
  2. Создаем реквизит внешней обработки с именем СсылкаНаОбъект . Тип реквизита — ссылка на справочник или документ, для которого создается внешняя печатная форма. Одна и та же форма может применяться для нескольких типов объектов, в этом случае тип данных реквизита СсылкаНаОбъект должен быть составным.
  3. В модуле объекта создаем экспортную функцию с именем Печать , которая должна возвращать готовый табличный документ печатной формы.

Часто бывает, что нужно слегка подкорректировать макет уже существующей печатной формы и сделать ее внешней. Например, добавить на макет печать организации и подпись руководителя.

Создание внешней печатной формы на основе стандартной с незначительными изменениями

Рассмотрим эту процедуру на примере создания внешней печатной формы универсального передаточного документа для документа Реализация товаров и услуг 1С:Бухгалтерии. От стандартной печатной формы она будет отличаться наличием печати организации.

  1. Создаем внешнюю обработку с реквизитом СсылкаНаОбъект, тип данных — ДокументСсылка.РеализацияТоваровУслуг.
  2. Находим макет стандартной печатной формы УПД (он находится в общих макетах) и копируем (перетаскиваем) его в окно внешней обработки. Макеты других печатных форм могут находиться в самих документах или справочниках.
  3. Вносим необходимые изменения в скопированный макет печатной формы.
  4. Находим функцию, отвечающую за формирование печатной формы. Эта функция должна возвращать сформированный табличный документ. Копируем ее содержание в экспортную функцию Печать() в модуле объекта внешней обработки.
    В нашем случае это функция ПечатьУниверсальногоПередаточногоДокумента() Экспорт из модуля объекта документа Реализация товаров и услуг.
    Если изменения макета были существенными (изменялись области и/или параметры), то необходимо внести соответствующие корректировки в функцию печати.
  5. Пытаемся сохранить внешнюю обработку. При этом, скорее всего, появятся сообщения об ошибках, связанных с отсутствием некоторых процедур и функций, вызываемых функцией печати. Эти функции и процедуры необходимо найти в исходном документе и так же скопировать в модуль объекта внешней обработки. Либо скорректировать ссылку, если исходная функция или процедура экспортная.
  6. (не обязательно). Для тестирования внешней печатной формы удобно сделать ее форму, на которую вынести реквизит СсылкаНаОбъект . Кнопка Выполнить должна вызывать процедуру Печать() из модуля объекта. Для этого событию нажатия кнопки задается процедура:

В данной статье описано как подключить внешнюю печатную форму в базу 1С на примере конфигурации «Управление торговлей 11.2»

Конфигурация «Управление торговлей 11.2» — это конфигурация на «УПРАВЛЯЕМЫХ» формах!

Наша инструкция «показывает» как подключить внешнюю печатную форму в информационной базе 1С с конфигурацией на «УПРАВЛЯЕМЫХ» формах а именно:

  • «Бухгалтерия 3.0»
  • «Управление торговлей 11.2»
  • «Зарплата и управление персоналом 3.1»
  • «Комплексная автоматизация 2.0»
  • «Управление небольшой фирмой 1.6»
  • «Розница 2.2»
  • и другие подобные конфигурации.

Для того чтобы подключить внешнюю печатную форму в 1С нам понадобится пройти 11 шагов.

1 — Меню «НСИ и администрирование» (В других конфигурациях, как например в Бухгалтерии предприятия 3.0, может называться просто — «Администрирование»). 2 — Выбираем «Печатные формы, отчеты и обработки» (см. рис. ниже ↓)

3 — Раскрываем подменю «Отчеты и обработки» (В других конфигурациях, как например в Бухгалтерии предприятия 3.0, такого подменю может не оказаться, поэтому сразу переходим к следующему действию). 4 — Ставим «галочку» Использование дополнительных отчетов и обработок. 5 — Переходим в раздел: Дополнительные отчеты и обработки. (см. рис. ниже ↓) ()

6 — Нажимаем кнопку «Создать». (см. рис. ниже ↓)

В новых версиях 1С (начиная с августа 2016 года) в программу встроен механизм предупреждения об опасности использования неизвестных внешних обработок, которые могут содержать «вирусы», в более ранних версиях программы предупреждение возникать не будет! Если оно возникло, то для подключения внешней печатной формы будет необходимо — 7 — нажать кнопку «Продолжить». (см. рис. ниже ↓)

8 — Выбираем каталог в котором находится обработка. 9 — Выделяем ее (нужную нам обработку). 10 — Нажимаем кнопку «Открыть». Либо вместо действий 9 и 10 можно просто дважды кликнуть по нужной нам внешней печатной форме в окне выбора. (см. рис. ниже ↓)

Если нам необходимо добавить размещение для добавляемой обработки (Например, это Универсальная форма договора с нашего сайта и нам надо, чтобы команда печати этой формы выводилась в каком-то объекте, в котором изначально не выводится) — 11 — нажимаем на строку размещения («Разместить в:», может быть «Размещение:») и выбираем необходимые справочники и документы. 12 — Завершаем действия по подключению внешней печатной формы нажатием кнопки «Записать и закрыть». (см. рис. ниже ↓)

Вот и все! Поздравляем! Внешняя печатная форма подключена! А все ли мы сделали правильно? Проверим…

Перед Записью и закрытием мы обратили внимание что данная внешняя печатная форма размещена в документе Реализация товаров и услуг, а значит возможности печати открываем любой документ вида: «Реализация товаров и услуг». нажимаем кнопку «Печать» и видим — появилось окно выбора печатных форм, среди них присутствует — 13 — подключенная нами внешняя печатная форма (см. рис. ниже ↓)

Теперь точно — всё. Мы надеемся что данная статья была вам полезна.

Как известно – без бумажки ты.. не может обойтись ни один серьезный бизнес. И когда мы говорим, что в 1С есть какие-то там электронные документы, то сразу же возникает вопрос как их распечатать в бумажном виде.

Процесс печати электронного документа 1С называется печатная форма 1С.

У каждого документа может быть несколько печатных форм 1С. Например, документ Реализация товаров и услуг (т.е. продажа) печатается в печатные формы 1С: ТОРГ-12, Накладная, Товарно-транспортная накладная, Акт оказанных услуг и так далее.

Суть печатной формы 1С – это шаблон (типа документа Excel), в котором заданы переменные. При процессе печати вместо переменных подставляется текст из электронного документа. Шаблон обычно хранится в конфигурации.

Проблема изменения типовой печатной формы 1С в том, что обычно типовую конфигурацию не желательно изменять, иначе будет сложнее обновляться. Поэтому появились начали изобретать велосипед различные методики использования внешних печатных форм 1С.

Внешняя печатная форма 1С – это шаблон печати, который хранится как то отдельно от самой конфигурации.

Однако это все теория. А как создать самому печатную форму? А еще лучше – как внести изменения в существующую?

Как печатается документ 1С

Чтобы распечатать любой документ 1С (который может быть распечатан) – нужно в документе нажать кнопку Печать. 1С предложит выбрать печатную форму 1С для этого документа из списка.

Слева от кнопки Печать обычно находится кнопка быстрого доступа к последней выбранной печатной форме 1С.

Результат печати выглядит вот так. Чтобы распечатать его на принтер, нужно поставить курсор в печатную форму 1С, нажать Ctrl+P или кнопку с принтером на панели кнопок или в меню Файл/Печать.

Настройки печати (поля, ориентация листа и т.п.) расположены в меню Файл/Параметры страницы. Также в настройках пользователя можно сделать, чтобы печать производилась сразу на принтер.

Откуда берется эта печатная форма?

Где находится печатная форма 1С

Зайдем в конфигуратор. Найдем в окне конфигурации нужный документ. Раскроем его ветку Макеты. Именно они и превращаются в печатную форму 1С при печати.

Однако маловато будет – нам предлагали выбрать гораздо больше вариантов при печати. Дело в том, что множество макетов печатных форм 1С спрятано в другом месте.

Вернемся вверх окна конфигурации 1С. Откроем ветку Общие, а потом ветку Общие макеты. Именно здесь и находится большинство макетов. Особенно это касается регламентированных государством печатных форм 1С – ТОРГ 12, Счет фактура и т.п.

Кстати не сложно заметить, что макетов ТОРГ12 или СчетФактуры Вы увидите несколько. Почему? Это легко объяснить. Законы и требования периодически меняются. Но мы не можем просто изменить один и тот же макет – а если придется распечатать документ от даты, которая находится ранее даты изменения. Поэтому делается несколько макетов и в зависимости от даты документа используется правильный.

Но и это не все! Есть же еще внешние макеты. Где же хранятся они?

Вернемся в режим 1С Предприятие. Через меню пользователя с административными правами Операции/Справочники, выберем справочник Внешние обработки.

Строки этого справочника, которые имеют вид Печатная форма, добавляют варианты печати для документа, указанного в таблице Принадлежность печатной формы (на картинке это Реализация товаров услуг).

Для того, чтобы это заработало – Вы должны сделать внешнюю обработку, которая имеет в своем модуле объекта процедуру Печать() с пометкой Экспорт, которая организует процесс печати.
Но мы забегаем вперед. Давайте сначала посмотрим как организован макет печатной формы 1С.

Макет печатной формы 1С

Макет печатной формы 1С выглядит следующим образом.

Как Вы видите – он поделен на блоки. Блоки могут быть горизонтальные (имя слева) и вертикальные (имя вверху).

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

Для того, чтобы назначить область – выделите несколько строк (или несколько колонок) и выберите в меню Таблица/Имена/Назначить имя. Чтобы убрать – там же есть команда Убрать имя.

Название нужно для того, чтобы к области можно было обращаться из программного кода. Название можно назначить не только строкам или колонкам, но и просто нескольким ячейкам. Для этого выделите ячейки и выберите то же меню.

Однако по умолчанию названия произвольных ячеек не отображаются. Чтобы увидеть их – выберите пункт меню Таблица/Имена/Отображать именованные ячейки.

Итак, сегодня мы узнали, что печатная форма 1С формируется с помощью макета. Макет состоит из блоков – по умному – именуемых областей.

Типовые (обычно используемые) блоки для печатной формы:

  • Шапка – выводится заголовок документа
  • Строка – выводится одна строка таблицы, этот блок повторяют столько раз, сколько нужно распечатать строк
  • Подвал – выводится окончание документа.

Теперь нам нужно разобраться с тем,

Осуществляется в соответствии со стандартным макетом печатной формы, встроенным в приложение разработчиками (его называют "поставляемым" макетом).

При необходимости, вы можете изменить стандартный макет и, в дальнейшем, осуществлять печать документа на основе вашего персонального ("пользовательского") макета. Для редактирования макета печатной формы предусмотрен механизм выгрузки на локальный компьютер. Правка макета проводится в локальной версии приложения системы "1С:Предприятие" (в частности, можно использовать бесплатное приложение 1С:Предприятие - Работа с файлами).


Для изменения макета печатной формы выполните следующее.




Редактирование макета печатной формы завершено, при выводе на печать документа будет использоваться макет, в который были внесены изменения.

Если вы захотите вернуться к прежнему макету печатной формы, нажмите кнопку Использовать стандартный макет . При этом, отредактированный макет будет по-прежнему присутствовать на сервере, и его можно будет снова включить нажатием кнопки Изменить .

Желаем приятной работы!

Как вставить в макет печатной формы логотип компании?

Приведем конкретный пример редактирования макета печатной формы Счета на оплату , а именно, рассмотрим, как вставить в него изображение, например, логотип компании (это изображение необходимо предварительно заготовить и сохранить в виде графического файла, например, в формате png или jpg).


Таким образом, теперь счета на оплату, которые вы готовите для передачи свои контрагентам, будет присутствовать логотип вашей компании. Для того чтобы добавить логотип и на другие документы, необходимо будет повторить описанные действия для соответствующих печатных форм этих документов.

Желаем приятной работы!

Как создать внешнюю печатную форму на основе готовой? 1С 8.0/8.1
_______________________________________________________

Предполагается, что у вас есть уже знания, полученные в процессе чтения темы, поэтому подробно затрагиваются только новые вопросы.

Итак: нам потребовалось немного изменить макет счёта на оплату покупателю (работать будем с конфигигурацией Бухгалтерия 1.6):
- убрать заголовок в макете счета на оплату (текст "Внимание! Оплата данного счета..., при наличии доверенности и паспорта.")
- изменить представление поставщика (т.е. нас) по требованию банка
(задача из реальной жизни с временем работы на 15-20 минут)

Создание обработки будет состоять их двух этапов:
1 - создание полного аналога исходной печатной формы
2 - доработка под собственные нужды

Этап первый

Для начала создадим пустую внешнюю обработку, только макет создавать не будем -
мы его скопируем для последующего изменения из основной конфигурации. Чтобы скопировать макет в обработку из конфигурации - достаточно
выделить его в дереве объектов, далее зайти в меню Правка -Копировать , после в дереве данных обработки в ветке макетов выбрать
в меню Правка -Вставить Более удобный путь - напрямую перетащить мышкой этой макет из основной конфигурации в дерево данных
обработки.

И пишем такой код:

Функция Печать() Экспорт //... тут мы что-нибудь напишем потом КонецФункции

Что мы сделали: для работы внешней печатной формы требуется экспортная (т.е. видимая для других объектов конфигурации) функция Печать ,
которая должна возвращать в основную программу сформированный табличный документ для предварительно просмотра и последующей печати.

Что бы не изобретать велосипед - посмотрим, как происходит формирование табличного документа в основной конфигурации: для этого мы зайдём
в модуль документа СчтНаОплатуПокупателю Найдём в модуле функцию Печать , которая выглядит примерно вот так:

// Процедура осуществляет печать документа. Можно направить печать на // экран или принтер, а также распечатать необходмое количество копий. // // Название макета печати передается в качестве параметра, // по переданному названию находим имя макета в соответствии. // // Параметры: // НазваниеМакета - строка, название макета. // Процедура Печать(ИмяМакета, КоличествоЭкземпляров = 1, НаПринтер = Ложь, НепосредственнаяПечать = Ложь) Экспорт // Получить экземпляр документа на печать Если ИмяМакета = "Счет" Тогда ТабДокумент = ПечатьСчетаЗаказа(ИмяМакета); КонецЕсли; УниверсальныеМеханизмы.НапечататьДокумент(ТабДокумент, КоличествоЭкземпляров, НаПринтер, РаботаСДиалогами.СформироватьЗаголовокДокумента(ЭтотОбъект, ""), НепосредственнаяПечать); КонецПроцедуры // Печать

В нашем случае получается, что для печати счёта в эту функцию передается параметр ИмяМакета равный строковой переменной "счет" ,
если посмотреть на код, мы увидим, что для формирование стандартного счета используется функция ПечатьСчетаЗаказа(...) , которую теперь
нам и требуется найти в коде модуля документа. Обвчно она расположена чуть выше функции печать(...)
Итак, вот сокращенный текст этой функции:

// Функция формирует табличный документ с печатной формой заказа или счета, // разработанного методистами // // Возвращаемое значение: // Табличный документ - сформированная печатная форма // Функция ПечатьСчетаЗаказа(Тип) Запрос = Новый Запрос; Запрос.УстановитьПараметр("ТекущийДокумент", ЭтотОбъект.Ссылка); // ...код программы... ОбластьМакета.Параметры.Заполнить(Шапка); ТабДокумент.Вывести(ОбластьМакета); Возврат ТабДокумент; КонецФункции // ПечатьСчетаЗаказа()

Как мы видим, в конце работы этой функции возвращается сформированный табличный документ - нам остается только полностью скопировать текст
этой функции (начиная со строки "Запрос = Новый Запрос;" и заканчивая строкой "Возрат ТабДокумент;") и вставить его в тело подготовленой функции
Печать в модуле нашей обработки.

После того, как вставим текст функции - попробуем сохранить обработку. Конфигуратор предупредит нас, что в модуле он обнаружил ошибки и выведет
их в в окно служебных сообщений. Вот примерный тест этих ошибок:

{ВнешняяОбработка.ВнешняяОбработка1(102,7)}: Переменная не определена (Тип) Если <>Тип = "Счет" Тогда {ВнешняяОбработка.ВнешняяОбработка1(224,7)}: Переменная не определена (Тип) Если <>Тип = "Счет" Тогда {ВнешняяОбработка.ВнешняяОбработка1(107,15)}: Переменная не определена (СтруктурнаяЕдиница) Если ТипЗнч(<>СтруктурнаяЕдиница) = Тип("СправочникСсылка.БанковскиеСчета") Тогда {ВнешняяОбработка.ВнешняяОбработка1(108,40)}: Переменная не определена (СтруктурнаяЕдиница) Банк = ?(НЕ ЗначениеЗаполнено(<>СтруктурнаяЕдиница.БанкДляРасчетов), СтруктурнаяЕдиница.Банк, СтруктурнаяЕдиница.БанкДляРасчетов); {ВнешняяОбработка.ВнешняяОбработка1(108,77)}: Переменная не определена (СтруктурнаяЕдиница) Банк = ?(НЕ ЗначениеЗаполнено(СтруктурнаяЕдиница.БанкДляРасчетов), <>СтруктурнаяЕдиница.Банк, СтруктурнаяЕдиница.БанкДляРасчетов); {ВнешняяОбработка.ВнешняяОбработка1(108,102)}: Переменная не определена (СтруктурнаяЕдиница) Банк = ?(НЕ ЗначениеЗаполнено(СтруктурнаяЕдиница.БанкДляРасчетов), СтруктурнаяЕдиница.Банк, <>СтруктурнаяЕдиница.БанкДляРасчетов); {ВнешняяОбработка.ВнешняяОбработка1(112,38)}: Переменная не определена (СтруктурнаяЕдиница) НомерСчета = ВернутьРасчетныйСчет(<>СтруктурнаяЕдиница); {ВнешняяОбработка.ВнешняяОбработка1(123,21)}: Переменная не определена (СтруктурнаяЕдиница) Если ПустаяСтрока(<>СтруктурнаяЕдиница.ТекстКорреспондента) Тогда {ВнешняяОбработка.ВнешняяОбработка1(125,27)}: Переменная не определена (СтруктурнаяЕдиница) Если ЗначениеЗаполнено(<>СтруктурнаяЕдиница.БанкДляРасчетов) Тогда {ВнешняяОбработка.ВнешняяОбработка1(126,59)}: Переменная не определена (СтруктурнаяЕдиница) ТекстКорреспондента = ТекстКорреспондента + " р/с " + <>СтруктурнаяЕдиница.НомерСчета {ВнешняяОбработка.ВнешняяОбработка1(127,15)}: Переменная не определена (СтруктурнаяЕдиница) + " в " + <>СтруктурнаяЕдиница.Банк + " " + СтруктурнаяЕдиница.Банк.Город; {ВнешняяОбработка.ВнешняяОбработка1(127,47)}: Переменная не определена (СтруктурнаяЕдиница) + " в " + СтруктурнаяЕдиница.Банк + " " + <>СтруктурнаяЕдиница.Банк.Город; {ВнешняяОбработка.ВнешняяОбработка1(130,26)}: Переменная не определена (СтруктурнаяЕдиница) ТекстКорреспондента = <>СтруктурнаяЕдиница.ТекстКорреспондента; {ВнешняяОбработка.ВнешняяОбработка1(112,17)}: Процедура или функция с указанным именем не определена (ВернутьРасчетныйСчет) НомерСчета = <>ВернутьРасчетныйСчет(СтруктурнаяЕдиница);

Давайте разберём эти ошибки:
*** 1. Переменная не определена (Тип) - если посмотреть исходный код функции, становиться ясно, что переменная тип являлась параметром:
Функция ПечатьСчетаЗаказа(Тип) , мы же этот параметр удалили. В данном случае - этот параметр содержал в себе строку с именем макета
для печати. Т.к. нам требуется печатать только один макет - определеим эту переменную следующим образом: мы измененим заголовок
функции Печать в модуле обработки:

Функция Печать(Тип = "Счет")

Что означает такая запись: она означает, что если в функцию небыл передан параметр, то параметр Тип примет значение
по умолчанию "Счет" , что нам и требуется для работы.

*** 2. Переменная не определена (СтруктурнаяЕдиница) - данная переменная является реквизитом документа СчетНаОплатуПокупателю , т.к.
в модуле внешней печатной формы мы этот реквизит не видим (мы не находимся в теле объекта документ), то получим эту переменную через
ссылку на документ, т.е. через реквизит обработки СсылкаНаОбъект , в который програама передат ссылку на текущий документ.
Добавим в начало функции следующую строку:

*** 3. Процедура или функция с указанным именем не определена (ВернутьРасчетныйСчет) - данная функция определена (т.е. описана) в модуле
документа, соответственно - нам достаточно полностью перенести код этой функции в нашу обработку.

Итак, теперь модуль обработки выглядит примерно следующим образом:

Функция ВернутьРасчетныйСчет(СчетКонтрагента) БанкДляРасчетов = СчетКонтрагента.БанкДляРасчетов; Результат = ?(БанкДляРасчетов.Пустая(), СчетКонтрагента.НомерСчета, СчетКонтрагента.Банк.КоррСчет); Возврат Результат; КонецФункции // ВернутьРасчетныйСчет() // Функция формирует табличный документ с печатной формой заказа или счета, // разработанного методистами // // Возвращаемое значение: // Табличный документ - сформированная печатная форма // Функция Печать(Тип = "Счет") Экспорт СтруктурнаяЕдиница = СсылкаНаОбъект.СтруктурнаяЕдиница; Запрос = Новый Запрос; Запрос.УстановитьПараметр("ТекущийДокумент", ЭтотОбъект.Ссылка); // ...текст программы... ОбластьМакета.Параметры.Заполнить(Шапка); ТабДокумент.Вывести(ОбластьМакета); Возврат ТабДокумент; КонецФункции // ПечатьСчетаЗаказа()

Если всё правильно сделано - то теперь мы можем сохранить обработку и мы получим полный внешний аналог встроенной печатной формы.

Этап второй

Теперь внесём необходимые изменения при печати в макет (предполагается, что вы умеете работать с макетами), а также изменим
текст поставщика в шапке счёта.

Как мы видим по коду программы, текст получателя заполняется в этом месте:

Если ПустаяСтрока(СтруктурнаяЕдиница.ТекстКорреспондента) Тогда ТекстКорреспондента = СведенияОПоставщике.ПолноеНаименование; Если ЗначениеЗаполнено(СтруктурнаяЕдиница.БанкДляРасчетов) Тогда ТекстКорреспондента = ТекстКорреспондента + " р/с " + СтруктурнаяЕдиница.НомерСчета + " в " + СтруктурнаяЕдиница.Банк + " " + СтруктурнаяЕдиница.Банк.Город; КонецЕсли; Иначе ТекстКорреспондента = СтруктурнаяЕдиница.ТекстКорреспондента; КонецЕсли; ОбластьМакета.Параметры.ПредставлениеПоставщика = ТекстКорреспондента;

Закзазчик поставил условие, что бы текст для данной ячеки брался из наименования плательщика в платежных поручениях на
перечисление налогов. Этот текст храниться в реквизите элемента справочника Организации - нам осталось только
получить к нему доступ. Если посмотреть на реквизиты документа, то мы уидим что в них храниться данные об организации,
по которой выписывался документ, а нужный нам текст храниться в реквизите организации - теперь мы знаем, как получить доступ:

ОбластьМакета.Параметры.ПредставлениеПоставщика = СсылкаНаОбъект.Организация.НаименованиеПлательщикаПриПеречисленииНалогов;

Вот и всё - макет готов к работе и его можно подключать к конфигурации!

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

PS. Обсуждения, вопросы, предложения - всё в теме.