Внедрение 1C Блог О нас
 
1С:Франчайзинг На главную Написать нам

1С расширение конфигурации как работать


Расширения конфигурации в 1С 8.3

В данной статье предлагаю рассмотреть, что такое «расширение конфигурации», как добавить расширение или же отключить его. Начиная с версии 1C 8.3.6.1977 в платформе введен новый механизм – расширения конфигурации. Сначала немного теории.

Что такое расширения?

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

Для чего нужны расширения?

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

Снятие с полной поддержки влечет за собой ряд неудобств:

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

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

После обновления основной конфигурации, если произошли в новом релизе какие-то изменения с объектом, который ранее был изменен расширением, то изменения все равно возьмутся из расширения. То есть расширения имеют больший приоритет, чем основная конфигурация.

Пример добавления расширения в 1С

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

Получите 267 видеоуроков по 1С бесплатно:

В конфигураторе зайдем в меню «Конфигурация» и выберем пункт «Расширения конфигурации». Откроется окно со списком расширений (если они есть). Нажмем кнопку «Добавить» и добавим новое расширение. Теперь можно открыть конфигурацию расширения:

Как видно, конфигурация расширения имеет точно такую же структуру, как и основная. Только она изначально совершенно чистая, без объектов.

Недавно я писал статью о том, как самим сделать обработку для перенумерации объектов.  На её примере я хочу сделать ее встроенной при помощи расширения.

В обработке у меня есть поле со ссылкой на справочник «Организации». Поэтому мне этот справочник необходим. Но мы не будем создавать новый справочник «Организации», тем более что платформа этого и не позволит. Нельзя, чтобы в конфигурации расширения были объекты, одноименные с объектами в основной конфигурации.

Поэтому справочник мы позаимствуем из основной конфигурации:

Теперь нажмем правой кнопкой мышки на «Обработки» и выберем «Вставить внешнюю обработку, отчет…» Таким образом, добавим новую обработку в конфигурацию расширения. Если Вы используете мою обработку, то сразу переименуйте ее, так как в основной конфигурации уже есть обработка с таким именем.

Ну и последний штрих. Я хочу, чтобы моя обработка отражалась в меню «Администрирование». Для этого позаимствуем одноименную подсистему основной конфигурации. Не забудьте указать в обработке, что она относится к этой подсистеме.

Вот такая структура у меня получилась:

Посмотрим, что у нас получилось. Обновляем конфигурацию базы данных и запускаем программу в режиме 1C: Предприятие, и идем в меню «Администрирование». Да, чуть не забыл, конфигурацию расширения необходимо закрыть, иначе программа не запустится:

Таким образом, мы добавили в программу новую обработку, не изменив при этом основную конфигурацию.

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

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

Если Вы начинаете изучать 1С программирование, рекомендуем наш бесплатный курс (не забудьте подписаться на YouTube — регулярно выходят новые видео):

К сожалению, мы физически не можем проконсультировать бесплатно всех желающих, но наша команда будет рада оказать услуги по внедрению и обслуживанию 1С. Более подробно о наших услугах можно узнать на странице Услуги 1С или просто позвоните по телефону +7 (499) 350 29 00. Мы работаем в Москве и области.

programmist1s.ru

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

Изучив опыт использования предыдущих версий программы, и учтя тот факт, что каким бы универсальным и всеобъемлющим не было конкретное решение, в конечном итоге в 90% случаев требуется его доработка под конечного пользователя. Разработчики 8 версии программы 1С реализовали несколько принципиально новых решений для минимизации необходимости изменения стандартных механизмов конфигураций:

  • Буквально с первых версий программы у элементов многих справочников появилась возможность создания дополнительных свойств и категорий с использованием соответствующего плана видов характеристики и регистра сведений;
  • Дополнительные печатные формы и формы заполнения табличных частей, равно как и дополнительные отчеты и обработки теперь могут вызываться из соответствующего справочника;
  • Обработка стандартных процедур объектов осуществляется не внесением изменений в модуль, а путем подписок на события;
  • И, наконец, с версии платформы 8.3.6 появились в 1С расширения конфигурации.

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

Немного теории

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

  1. Сравнивать типовую и имеющуюся структуру метаданных;
  2. В случае существенного отличия типовых элементов следить за корректным обновлением;
  3. Вносить соответствующие изменения после обновления.

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

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

Ситуации, в которых можно использовать расширения

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

  • Расширения могут работать с управляемыми формами;
  • Механизм поддерживает изменение и добавление существующих подсистем;
  • До выхода платформы 8.3.8 в расширении можно было только изменять существующие роли, после обновления они позволили добавлять новые, ограничивая доступ даже к объектам основной базы;
  • Существующий механизм позволяет по собственному желанию изменять командный интерфейс подсистем и основного раздела конфигурации;
  • Также этот инструментарий позволяет добавлять обработки и отчеты без внесения изменений в структуру базы;
  • В версии платформы 8.3.9.718 значительно переработан механизм диагностирования совместимости расширения и основной конфигурации.

Из вышесказанного становится понятно, что:

  1. При работе с обычными формами функционал расширений значительно ограничен;
  2. Хотя и облегчился процесс обновления основной конфигурации, однако возможность использования конкретного расширения (в том числе и в качестве тиражных решений) может быть серьезно ограничена как изменениями исходной структуры, так и несколькими параллельно используемыми расширениями;
  3. Использовать этот механизм целесообразно в тех случаях, когда есть необходимость дифференциации внешнего вида и функционала, используемыми различными пользователями, либо когда собственными силами производится доработка типовой конфигурации, находящейся на поддержке.

Перейдем к практике. В качестве исходной базы мы будем использовать конфигурацию «Зарплата и управление персоналом» версии 3.1.3.223, работы будут осуществляться на платформе 8.3.10.2561, режим работы – файловый.

Создание расширения

В конфигураторе войдем в меню Конфигурация->Расширения конфигурации, откроется форма (Рис.1).

Рис.1

Именно здесь и можно создать новое расширение. Нажмем кнопку «Добавить». Вот и окно нового расширения (Рис.2)

Рис.2

Рассмотрим его элементы:

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

Список поля «Назначение» состоит из трех значений, опишем их в порядке исполнения:

  1. Исправление – расширения этого назначения создаются для корректировки незначительных неточностей и ошибок в заимствованных объектах;
  2. Адаптация – значение по умолчанию, расширения этого типа предназначены для подстройки типовых объектов под требования конкретного пользователя, (если расширение создавалось в версии программы ниже 8.3.9, после обновления платформы оно будет иметь именно это назначение);
  3. Дополнение – вносят совершенно новый функционал в типовое решение.

Запуск расширения

Двойной щелчок на имени расширения в окне из Рис.1, открывает окно расширения (Рис.3)

Рис.3

Как видим, оно представляет собой дерево, подобное дереву основной конфигурации. И здесь возникает один вопрос, в каких случаях следует заимствовать объект?

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

То есть, если для нашей разработки потребуется реквизит «ИНН» справочника «Физические лица», если он будет использован в модуле формы, мы должны его заимствовать из основной базы. В этом случае каждый раз при запуске расширения будет производиться проверка на наличие этого реквизита в справочнике основной конфигурации и на соответствие типа данных в исходной базе и в расширении.

Если после обновления или в ходе разработки нового функционала возникнет несогласованность между типами данных расширения и конфигурации или еще какие-то ошибки система проинформирует об этом пользователя (Рис.4)

Рис.4

Окно в правом нижнем углу указывает на нестандартную ситуации при подключении расширения, двойной клик на нем открывает подробную информацию. В данном случае мы просто поменяли тип значения у реквизита ИНН со значения «Строка» на значение «Булево» у заимствованного объекта, однако гораздо чаще бывает обратная ситуация – когда обновление типового продукта приводит к изменению или ликвидации реквизита основной базы.

Отработав и протестировав расширение на копии базы, его можно выгрузить в отдельный файл, для этого в окне (Рис.5) необходимо нажать кнопку «Конфигурация», выбрать пункт «Сохранить в файл». В отличие от обычных файлов конфигурации, имеющих расширение cf, файл дополнения к конфигурации будет иметь маску *.cfe.

Рис.5

Как видно из вышеприведенного рисунка загрузить новый функционал можно из того же окна, а можно из основного окна программы.

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

Путь для подключения доработки выглядит следующим образом: Все функции->Стандартные->Управление расширениями конфигурации. Открывающееся окно представлено на Рис.6

Рис.6

Нажатие на кнопку «Добавить», открывает диалоговое окно выбора файла, в котором необходимо выбрать нашу выгрузку. Если у обработки установлена галочка (Рис.7) и расширение содержит ошибку, подключение функционала будет отменено, и программа сообщит о возникновении исключительной ситуации.

Рис.7

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

Заимствование объектов и порядок срабатывания модулей

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

Рис.8

Добавим эту обработку в расширение.

Для этого:

  • Правой кнопкой мышки активизируем контекстное меню формы обработки (Рис.9);

Рис.9

  • Выберем пункт «Добавить в расширение»;
  • В дереве дополнительной конфигурации появится и сама обработка и дубликат её формы;
  • Открыв форму, мы обнаруживаем, что команда, вызывающая сообщение тоже есть, только ей не присвоен обработчик;
  • Добавление действия команды вызывает диалоговое окно (Рис.10) в котором помимо основных директив места исполнения команды, присутствуют еще группа «Тип вызова».

Рис.10

Мы имеем три типа вызова для имеющейся процедуры;

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

Оставим тип вызова в положении «Вызывать после» и добавим процедуру «Расш1_СообщитьПосле(Команда)» (Рис.11).

Рис.11

Результатом запуска нашей обработки будет последовательно сообщенные две фразы (Рис.12), то есть сообщение дополнительной конфигурации отобразиться после сообщения основной. В случае если бы мы выбрали «Вместо», первой строки мы бы вообще не увидели.

Рис.12

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

Механизм аннотаций

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

Рис.13

При добавлении каждого нового расширения система самостоятельно выстраивает порядок их исполнения.

Настройка порядка выполнения дополнительных модулей происходит исходя не только из времени добавления модуля (позже добавлено, позже исполняется), но и исходя из назначения доработки («Исполнение» всегда будет идти прежде «Адаптации»).

Кроме этого последовательность выполнения процедур добавляемых модулей можно регулировать с помощью аннотаций:

  • &Перед(«ИмяПроцедуры»);
  • &После(«ИмяПроцедуры»);
  • &Вместо(«ИмяПроцедуры»).

Как видно, их набор схож с тем, что был продемонстрирован в предыдущем разделе, сходен и функционал.

Так как заимствованный модуль и модуль-донор находятся в одном пространстве имен, никаких дополнительных определений для типовых переменных и методов в этом случае не нужно.

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

Для ликвидации такой «несправедливости» был создан метод ПродолжитьВызов().

Вообще говоря, использовать аннотацию «Вместо» немного не корректно, хотя порой и необходимо. Используя её, мы в значительной мере ограничиваем тот функционал, который может быть существенно изменен и доработан в типовых конфигурациях.

Внесение изменений в модуль объекта

Механизм подписок на события очень сильно облегчил работу разработчикам, но было одно серьезное НО.

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

Допустим, нам в процессе работы понадобилось добавить какую-либо обработку для типового документа «Прием на работу» при его записи. Раньше мы бы зашли в подписки и действовали оттуда, сейчас мы можем добавить этот документ к расширению:

  • Выберем в конфигураторе «ПриемНаРаботу» и из его контекстного меню добавим его в наше расширение (кстати этот механизм имеет комбинацию горячих клавиш Альт+Шифт+Ф2);
  • После выбора соответствующего дополнения мы получим картинку, как на Рис.14;

Рис.14

  • Нас будет интересовать выделенный желтым цветом элемент «Модуль объекта», откроем его, активировав предварительно соответствующей галочкой (Рис.15);

Рис.15

  • Мы получим чистый лист программного модуля, обратим внимание на верхнюю панель, а точнее, на элемент, представленный на Рис.16, в ниспадающем списке здесь представлены события, которые можно обработать для данного объекта;

Рис.16

  • Попробуем в сообщении вывести номер документа при его записи, выбрав соответствующее событие;
  • Мы получим форму выбора типа вызова (Рис.17), определим, когда будет выводиться номер;

Рис.17

  • Код процедуры показан на Рис.18;

Рис.18

В некоторых случаях из-за установленной галочки «Безопасный режим», подключение расширения происходит с ошибкой.

Небольшой анонс

В ближайшее время фирма 1С планирует выпуск платформы 8.3.11, в которой они анонсировали возможность добавления собственных:

  • Документов;
  • Справочников;
  • Планов обмена;
  • Регистров сведений.

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

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

blog.it-terminal.ru

Автоматизация бизнеса на платформе 1С:Предприятие 8

Содержание 1. Как создать расширение конфигурации 2. Как перенести метаданные для нашего расширения 3. Добавляем код

1. Как создать расширение конфигурации.

1с расширение конфигурации как работать? Все очень просто, первым делом необходимо понять, какой функционал из расширения можно использовать. Разделить можно на две части: • Совместимость с 8.3.6 по 8.3.8 – 1с расширения конфигурации работают только с модулями форм, отчетов, обработок, ролями и подсистемами. • Совместимость с 8.3.9 и выше – в расширения добавляется еще работа с модулями объектов, менеджерами объектов и общие модули (не все). Совместимость находится в свойствах конфигурации

Создаем новое расширение в конфигураторе в окне «Расширения конфигурации», меню Конфигурация -> Расширения конфигурации. 

Для полноценной работы с расширением сразу рекомендую снять безопасный режим с расширения

      

2. Как перенести метаданные для нашего расширения

Расширение конфигурации 1с 8.3 имеет функционал переноса метаданных из основной конфигурации в свою. Это необходимо, чтобы расширение видело те объекты основной конфигурации, с которыми будет работать, и при необходимости будет проверять при подключении. Добавление метаданных происходит следующим образом 

В расширение конфигурации общий модуль можно добавить таким же самым способом и работать с ним как с модулем объекта. 

3. Добавляем код

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

Дописываем код на получение остатков и в итоге получаем в форме следующие процедуры. Листинг модуля формы:

Результат работы с и без расширения:

Вторая доработка требует неким образом модифицировать движения документа при проведении.  Для примера в регистре накопления «Расчеты с контрагентом» поменяем все суммы на цифру 1.

Расширение конфигурации 8.3 может использовать три типа вызова: перед, после, вместо. В нашем случае будет использоваться модуль объекта документа. Для решения задачи достаточно было бы добавить вызов процедуры «ОбработкаПроведения» с типом вызова «после». Но в документе «Реализация товаров и услуг» используется принудительная запись, говорящая нам о том, что дальнейшие изменения с движением документа не запишутся, если их принудительно не записать. Но выберем другое решение, полностью заменим процедуру «ОбработкаПроведения».

Создаем вызов процедуры «ОбработкаПроведения» с типом вызова «вместо».

Копируем полностью код основной процедуры и перед принудительной записью добавляем наши строки корректировки движения.

Листинг модуля объекта:

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

Результат работы с и без расширения:

Как результат расширения неплохо помогают с задачей изменить функционал, но не снимать конфигурацию с поддержки.

Пример расширения конфигурации можно скачать ЗДЕСЬ.

Евгений Аверкин,

разработчик компании ООО “Кодерлайн”

www.koderline.ru

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

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

Если кто не знаком с технологией расширений, то основную информацию можно получить из моих видео-уроков.

Семь видео-уроков по работе с расширениями конфигурации!

Все примеры я показываю на демонстрационной конфигурации «Управляемое приложение 1С», априори предполагается, что её нельзя изменять.

Имейте в виду, что перехват событий и методов работает только тогда, когда режим совместимости установлен в «Не использовать» (так было для платформы 8.3.10.1981), по сути это единственное изменения конфигурации  «Управляемое приложение», которое я сделал…

В расширении можно перехватывать типовые процедуры модуля объекта. Имеется возможность сделать три варианта перехвата «типовой» процедуры: «перехватить» событие перед выполнением метода (с помощью аннотации &Перед), «перехватить» событие после выполнения метода (с помощью аннотации &После), а так же выполнить вместо типовой процедуры процедуру расширения (с помощью аннотации &Вместо).

В задачах ниже мы разберем работу «перехватчиков»

Задача: В расширении создадим собственный макет печати документа «Расход товара». И добавим команду на форму расходной накладной «Печать расходной накладной (расширение)» при выполнении которой будет печататься макет из расширения.

Для этого создадим расширение конфигурации «ДляРасходаТовара», заимствуем в это расширение документ «Расход товара», а так же форму.

Скопируем (именно скопируем, а не заимствуем) из расширяемой конфигурации макет «МакетПечати», переименуем его и изменим сам макет, что бы можно было отличать.

Теперь нам нужно скопировать (тоже именно скопировать, а не заимствовать) команду документа «Печать расходной накладной», но группа, в которую входит команда у нас не скопируется, поэтому перед этим необходимо заимствовать группу «Печать»

После этого копируем команду «Печать расходной накладной», и так же переименовываем, и не забудем указать тип параметра команды – ссылку на документ «Расход товаров»

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

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

Всё из-за того, что в команде расширения используется метод документа ПечатнаяФорма, в котором и «подтягивается» нужный макет.

Перехватим процедуру ПечатнаяФорма модуля объекта, и переделаем её. Для того что бы понимать, что мы используем табличный документ из расширения, будем, когда вызываем процедуру из команды расширения, передавать в неё структуру с табличным документом. А потом в перехваченной процедуре ПечатнаяФорма в зависимости от типа параметра будем использовать тот или иной макет: если параметр имеет тип ТабличныйДокумент, то будем использовать типовой макет, а если параметр имеет тип Структура, то будем использовать макет из расширения. Для того, что бы перехватить процедуру или функцию в модуле объекта необходимо написать аннотацию &Вместо и после неё в скобочках название перехваченного метода.

Напишем в модуле расширения следующий код:

&Вместо(«ПечатнаяФорма») Процедура РТ_ПечатнаяФорма(ТабличныйДокумент)     /// КонецПроцедуры // ПечатнаяФорма(ТабличныйДокумент)

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

Теперь скопируем код из процедуры ПечатнаяФорма расширенной конфигурации, и переделаем, как описано выше.

&Вместо(«ПечатнаяФорма») Процедура РТ_ПечатнаяФорма(ТабличныйДокумент)     Если ТипЗнч(ТабличныйДокумент) = тип(«Структура») Тогда         ТабличныйДокумент = ТабличныйДокумент.ТабДок;         Макет = Документы.РасходТовара.ПолучитьМакет(«РТ_МакетПечати»);     иначеМакет = Документы.РасходТовара.ПолучитьМакет(«МакетПечати»);     КонецЕсли;//—————-основной код из расширенной конфигурации—————///     // ЗаголовокОбласть = Макет.ПолучитьОбласть(«Заголовок»);     ТабличныйДокумент.Вывести(Область);     // Шапка     Шапка = Макет.ПолучитьОбласть(«Шапка»);     Шапка.Параметры.Заполнить(ЭтотОбъект);     ТабличныйДокумент.Вывести(Шапка);     // Товары     Область = Макет.ПолучитьОбласть(«ТоварыШапка»);     ТабличныйДокумент.Вывести(Область);     ОбластьТовары = Макет.ПолучитьОбласть(«Товары»);     //Обход ТЧ     Для каждого ТекСтрокаТовары Из Товары Цикл         ОбластьТовары.Параметры.Заполнить(ТекСтрокаТовары);         ТабличныйДокумент.Вывести(ОбластьТовары);     КонецЦикла;

КонецПроцедуры

// ПечатнаяФорма(ТабличныйДокумент)

Нам осталось переделать код в команде расширения РТ_ПечатьРасходнойНакладной

&НаСервере Функция ПечатнаяФорма(ПараметрКоманды)     ТабличныйДокумент = Новый ТабличныйДокумент;     ТабличныйДокумент.ОтображатьСетку = Ложь;     ТабличныйДокумент.Защита = Ложь;     ТабличныйДокумент.ТолькоПросмотр = Ложь;     ТабличныйДокумент.ОтображатьЗаголовки = Ложь;     Сформирован = Ложь;     ///создаем струкутуру, для передачи в процедуру     СтруктураПередачи = Новый Структура(«ТабДок»,ТабличныйДокумент);     Для каждого Ссылка Из ПараметрКоманды Цикл         Документ = Ссылка.ПолучитьОбъект();         Если НЕ Документ.Проведен Тогда             Сообщение = Новый СообщениеПользователю();             Сообщение.Текст = «Документ не проведен: » + Строка(Документ);             Сообщение.КлючДанных = Ссылка;             Сообщение.Сообщить();             Продолжить;         КонецЕсли;Документ.ПечатнаяФорма(СтруктураПередачи); //передали структуру         Сформирован = Истина;     КонецЦикла;

    Если

Сформирован Тогда         Возврат ТабличныйДокумент;     Иначе         Возврат Неопределено;     КонецЕсли; КонецФункции&НаКлиенте Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)     ТабличныйДокумент = ПечатнаяФорма(ПараметрКоманды);     Если ТабличныйДокумент Неопределено Тогда         ТабличныйДокумент.Показать();     КонецЕсли;

КонецПроцедуры

Сейчас, после того, как сохраним расширение, то спокойно сможем распечатать макет расширения.

////////////////////

Задача: Перед проведением документа «Расход товара»  будем проверять, внес ли контрагент аванс (должен быть больше суммы продажи), если нет, то не проведем документ.

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

Напишем в модуле документа «Расход товара» следующий код

&Вместо(«ОбработкаПроведения») Процедура РТ_ОбработкаПроведения(Отказ, Режим)     Запрос = Новый Запрос;     Запрос.Текст = «ВЫБРАТЬ     |    ВзаиморасчетыОстатки.СуммаОстаток КАК СуммаОстаток     |ИЗ     |    РегистрНакопления.Взаиморасчеты.Остатки(     |            &МоментВремени,     |            Контрагент = &Контрагент     |                И Валюта = &Валюта) КАК ВзаиморасчетыОстатки»;Запрос.УстановитьПараметр(«МоментВремени»,?(Режим = РежимПроведенияДокумента.Оперативный,ТекущаяДата(),МоментВремени()));     Запрос.УстановитьПараметр(«Контрагент», Ссылка.Покупатель);     Запрос.УстановитьПараметр(«Валюта»,Ссылка.Валюта);     //устанавливаем блокировки     Блокировка = Новый БлокировкаДанных;     ЭлБлокировки = Блокировка.Добавить(«РегистрНакопления.Взаиморасчеты»);     ЭлБлокировки.Режим = РежимБлокировкиДанных.Исключительный;     ЭлБлокировки.УстановитьЗначение(«Контрагент»,Ссылка.Покупатель);     ЭлБлокировки.УстановитьЗначение(«Валюта»,Ссылка.Валюта);     Блокировка.Заблокировать();     ///     Результат = Запрос.Выполнить();     Выборка = Результат.Выбрать();     Выборка.Следующий();     Если Ссылка.Товары.Итог(«Сумма») > Выборка.СуммаОстаток Тогда         СуммаНеДобора = Ссылка.Товары.Итог(«Сумма») + Выборка.СуммаОстаток;         Сообщение = Новый СообщениеПользователю;         Сообщение.Текст = «Авансов у покупателя недостаточно!» + Символы.ПС + «Не хватает » + СуммаНеДобора ;         Сообщение.Поле = «Покупатель»;         Сообщение.УстановитьДанные(ЭтотОбъект);         Сообщение.Сообщить();         Отказ = Истина;     КонецЕсли;ПродолжитьВызов(Отказ,Режим); КонецПроцедуры

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

Посмотрим, как сработает наш перехват события

Кроме того, что мы можем написать метод, который сработает взамен метода расширенной конфигурации, мы можем написать процедуру (функцию), которая выполниться перед или после какой-нибудь «типового» метода модуля объекта. Для этого нужно использовать аннотации &Перед и &После.

Решим следующую задачу: в конфигурации «Управляемое приложение 1С» на основании контрагента нужно можно создать документ «Расход товара», в котором заполнится Контрагент и поле «Вид цены». Допустим нам не нужно автоматическое заполнение вида цены, поэтому мы перехватим событие после выполнения процедуры ОбработкаЗаполнения в модуле документа «Расход товара», где присвоим полю Вид цены пустую ссылку. Получиться вот такой код

&После(«ОбработкаЗаполнения») Процедура РТ_ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)     Если ТипЗнч(ДанныеЗаполнения) = Тип(«СправочникСсылка.Контрагенты») Тогда         ВидЦен = Справочники.ВидыЦен.ПустаяСсылка();     КонецЕсли;

КонецПроцедуры

Если мы сейчас создадим на основании контрагента документ «Продажи», то поле «Вид Цены» будет пустое

Теперь перейдем к формам.

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

Разберем работу перехвата событий форм на ряде примеров.

Задача:  В документе «Расход товара» после выбора контрагента в окно «Обоснование отгрузки» будем записывать информацию из реквизита контрагента «Дополнительная информация».

Для этого перехватим событие после изменения поля «Покупатель».  Зайдем в палитру свойств поля «Покупатель» формы документа «Расход товара» нашего расширения. И нажмем на пиктограмму «Лупа» рядом с событием «При изменении», после этого выйдет форма, где по мимо знакомых вариантов клиент, сервер и т.д., появятся варианты вызова события: перед, после и вместо.

Выберем на клиенте и после.

После выбора в палитре свойств рядом с созданным событием появилась соответствующая пиктограмма.

В модуле формы обработка создалась. Напишем следующий код.

&НаСервереБезКонтекста Функция ПолучитьДопИнформацию(Контрагент)     Возврат Контрагент.ДополнительнаяИнформация; КонецФункции&НаКлиенте Процедура РТ_ПокупательПриИзмененииПосле(Элемент)     Объект.ОбоснованиеОтгрузки = ПолучитьДопИнформацию(Объект.Покупатель); КонецПроцедуры

Теперь, если мы выберем контрагента, то заполнится информация в поле документа «Обоснование отгрузки»

И последняя задача будет немного поинтереснее: в документе «Расход товара» в табличной части Товары сделаем возможность выбора только номенклатуры с видом Товар. В демонстрационной конфигурации есть товары с видом услуга. Они показаны на этом рисунке

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

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

Почему вместо типового? Потому что типового обработчика события ПриСозданииНаСервер формы выбора справочника Товары нет, и я решил сделать вместо. Хотя можно сделать после.

Теперь напишем код, в котором будем устанавливать отбор на динамический список «Список»  формы выбора.

&НаСервере Процедура РТ_ПриСозданииНаСервереВместо(Отказ, СтандартнаяОбработка)     Если Параметры.Свойство(«Вид») Тогда         Отбор = Список.Отбор;         НовыйЭлОтбора = Отбор.Элементы.Добавить(Тип(«ЭлементОтбораКомпоновкиДанных»));         НовыйЭлОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(«Вид»);         НовыйЭлОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;         НовыйЭлОтбора.ПравоеЗначение = Параметры.Вид;     КонецЕсли;

КонецПроцедуры

Все. С формой выбора мы покончили, и можем начать работать с формой документа «Расход товара». Первым делом, создадим событие НачалоВыбора поля Товар таблицы Товары, которое будем выполнять в место типового.

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

&НаКлиенте Процедура РТ_ТоварыТоварНачалоВыбораВместо(Элемент, ДанныеВыбора, СтандартнаяОбработка)     //отменим стандартный вызов     СтандартнаяОбработка = Ложь;     //передадим параметры на форму     ПараметрыОткрытия = Новый Структура;     ПараметрыОткрытия.Вставить(«Вид»,ПредопределенноеЗначение(«Перечисление.ВидыТоваров.Товар»));     //опишем оповещение о закрытии     ОповещениеОЗакрытииВыбораТовара = Новый ОписаниеОповещения(«ВыполнитьПослеЗакрытияВыбораТовара»,ЭтотОбъект);     ОткрытьФорму(«Справочник.Товары.ФормаВыбора»,ПараметрыОткрытия                 ,ЭтаФорма                 ,УникальныйИдентификатор                 ,,,                 ОповещениеОЗакрытииВыбораТовара,); КонецПроцедуры

Не забудем написать процедуру, которая должна сработать после закрытия формы выбора

&НаКлиенте Процедура ВыполнитьПослеЗакрытияВыбораТовара(РезультатЗакрытия,ДополнительныеПараметры) Экспорт     Если Не ЗначениеЗаполнено(РезультатЗакрытия) Тогда         Возврат;     КонецЕсли;Идентификатор = Элементы.Товары.ТекущаяСтрока;     СтрТовара = Объект.Товары.НайтиПоИдентификатору(Идентификатор);     СтрТовара.Товар = РезультатЗакрытия; КонецПроцедуры

Теперь при выборе товаров из документа «Расход товара» каталог «Услуги» будет пуст.

Но, заметьте, можно будет подобрать услугу, вводя вручную её название в поле товар.

Что бы такого не было, мы перехватим событие формы АвтоПодбор, наше событие будет выполняться вместо события расширенной конфигурации.

В этом обработчике будем накладывать отбор в параметрах получения данных

&НаКлиенте Процедура РТ_ТоварыТоварАвтоПодборВместо(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка)     Отбор = ПараметрыПолученияДанных.Отбор;     Отбор.Вставить(«Вид»,ПредопределенноеЗначение(«Перечисление.ВидыТоваров.Товар»)) КонецПроцедуры

Теперь при подборе с клавиатуры услуги не будут выходить.

На этом всё. Надеюсь, эта статья принесла Вам пользу, и помогла понять, как можно перехватывать «Типовые» события при помощи расширений конфигурации.

Книга «Азбука расширений конфигураций 1С»

В книге «Азбука расширений конфигураций 1С» в доступной форме подробно шаг за шагом даются основы работы с этим механизмом расширений конфигураций 1С.

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

Книга «Программировать в 1С за 11 шагов»

Изучайте программирование в 1С в месте с моей книги «Программировать в 1С за 11 шагов»

  1. Книга написана понятным и простым языком — для новичка.
  2. Научитесь понимать архитектуру 1С;
  3. Станете писать код на языке 1С;
  4. Освоите основные приемы программирования;
  5. Закрепите полученные знания при помощи задачника;

Книга «Основы разработки в 1С: Такси»

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

  1. Очень доступный и понятный язык изложения
  2. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
  3. Поймете идеологию управляемого приложения 1С
  4. Узнаете, как разрабатывать управляемое приложение;
  5. Научитесь разрабатывать управляемые формы 1С;
  6. Сможете работать с основными и нужными элементами управляемых форм
  7. Программирование под управляемым приложением станет понятным

Промо-код на скидку в 15% — 48PVXHeYu

Если Вам помог этот урок решить какую-нибудь проблему, понравился или оказался полезен, то Вы можете поддержать мой проект, перечислив любую сумму:

можно оплатить вручную:

Яндекс.Деньги — 410012882996301 Web Money — R955262494655

Вступайте в мои группы:

Вконтакте: https://vk.com/1c_prosto Фейсбуке: https://www.facebook.com/groups/922972144448119/ ОК: http://ok.ru/group/52970839015518 Твиттер: https://twitter.com/signum2009

www.1s-up.ru


Смотрите также