Добрый день. Постановка задачи - создать возможность ввести на основании счета покупателю - счета поставщику. Было принято решение это делать через расширение.
В расширении была создана такая внешняя команда:
С таким тексом модуля команды:
&НаКлиенте Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) СтрДанные = Новый Структура("Основание", ПараметрКоманды); ПараметрыФормы = Новый Структура("ЗначенияЗаполнения", СтрДанные); ОткрытьФорму("Документ.СчетНаОплатуПоставщика.ФормаОбъекта", ПараметрыФормы, ПараметрыВыполненияКоманды.Источник, ПараметрыВыполненияКоманды.Уникальность, ПараметрыВыполненияКоманды.Окно, ПараметрыВыполненияКоманды.НавигационнаяСсылка); КонецПроцедуры
В модуле документа СчетаНаОплатуПоставщика была добавлена процедура:
&После("ОбработкаЗаполнения") Процедура ЕВ_ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка) Если ТипЗнч(ДанныеЗаполнения) = Тип("Структура") Тогда Если ДанныеЗаполнения.Свойство("Основание") Тогда Если ТипЗнч(ДанныеЗаполнения.Основание) = Тип("ДокументСсылка.СчетНаОплатуПокупателю") Тогда ЗаполнитьПоСчетуПокупателю(ДанныеЗаполнения.Основание); КонецЕсли; КонецЕсли; КонецЕсли; КонецПроцедуры
Далее в процедуре "ЗаполнитьПоСчетуПокупателю" были прописаны алгоритмы заполнения документа.
На этом все, для некоторых документов вероятнее всего нужно будет прописать алгоритм создания команды ввода на основании в модуле менеджера объекта, в данном случае это не потребовалось.
Т.к есть ввод на основании, то не плохо бы сделать и вывод документа в структуру подчиненности, подумал я и сделал)
В расширение была заимствована общая форма "СтруктураПодчиненности".
В ней прописана такая процедура:
&Вместо("ОбъектыПоКритериюОтбора") Функция ЕВ_ОбъектыПоКритериюОтбора(ЗначениеКритерияОтбора) Если Не Метаданные.КритерииОтбора.СвязанныеДокументы.Тип.СодержитТип(ТипЗнч(ЗначениеКритерияОтбора)) Тогда Возврат Неопределено; КонецЕсли; УстановитьПривилегированныйРежим(Истина); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | СвязанныеДокументы.Ссылка КАК Ссылка |ИЗ | КритерийОтбора.СвязанныеДокументы(&ЗначениеКритерияОтбора) КАК СвязанныеДокументы | |ОБЪЕДИНИТЬ ВСЕ | |ВЫБРАТЬ | СчетНаОплатуПоставщика.Ссылка |ИЗ | Документ.СчетНаОплатуПоставщика КАК СчетНаОплатуПоставщика |ГДЕ | СчетНаОплатуПоставщика.ЕВ_ДокументОснование = &ЗначениеКритерияОтбора | И НЕ СчетНаОплатуПоставщика.Ссылка = &ЗначениеКритерияОтбора | |ОБЪЕДИНИТЬ ВСЕ | |ВЫБРАТЬ | СчетНаОплатуПоставщика.ЕВ_ДокументОснование |ИЗ | Документ.СчетНаОплатуПоставщика КАК СчетНаОплатуПоставщика |ГДЕ | СчетНаОплатуПоставщика.Ссылка = &ЗначениеКритерияОтбора | И НЕ СчетНаОплатуПоставщика.ЕВ_ДокументОснование = &ЗначениеКритерияОтбора"; Запрос.УстановитьПараметр("ЗначениеКритерияОтбора", ЗначениеКритерияОтбора); Возврат Запрос.Выполнить().Выгрузить(); КонецФункции
Как видно из запроса, в качестве места где хранится документ основание, я использовал новый реквизит "ЕВ_ДокументОснование", причем он был добавлен непосредственно в конфигурацию, это было согласованно с закачиком. Данный вариант был выбран как наиболее надежный.
Для того чтобы соблюсти замочный принцип, можно использовать например дополнительные реквизит и записать туда идентификатор объекта ну или на крайний случай номер, главное чтобы потом, этот доп реквизит никто не изменил.
Ну и если предусмотреть дальнейшее развитие, т.е добавление нескольких документов, то стоит немного пересмотреть запрос и анализировать переменную "ЗначениеКритерияОтбора"
P.S Надеюсь статья будет вам полезна.