1. Двойной щелчок по документу “Реализация товаров и услуг” – вкладка “Ввод на основании”;
2. Вводится на основании – выбираем “Документ.ПоступлениеТоваровИУслуг” и “Документ.РеализацияТоваровИУслуг”;
3. Нажимаем кнопку “Конструктор ввода на основании”;
4. Для обоих объектов жмем “Заполнить выражение” – всё заполнилось кроме склада для поступления;
5. Выбираем Склад из шапки документа “ПоступлениеТоваровИУслуг”, жмем “ОК”, формируется код:
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
//{{__КОНСТРУКТОР_ВВОД_НА_ОСНОВАНИИ
// Данный фрагмент построен конструктором.
// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
Если ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.ПоступлениеТоваровИУслуг") Тогда
// Заполнение шапки
Договор = ДанныеЗаполнения.Договор;
Контрагент = ДанныеЗаполнения.Контрагент;
Организация = ДанныеЗаполнения.Организация;
Для Каждого ТекСтрокаТовары Из ДанныеЗаполнения.Товары Цикл
НоваяСтрока = Товары.Добавить();
НоваяСтрока.Количество = ТекСтрокаТовары.Количество;
НоваяСтрока.Номенклатура = ТекСтрокаТовары.Номенклатура;
НоваяСтрока.Сумма = ТекСтрокаТовары.Сумма;
НоваяСтрока.Цена = ТекСтрокаТовары.Цена;
КонецЦикла;
ИначеЕсли ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.РеализацияТоваровИУслуг") Тогда
// Заполнение шапки
Договор = ДанныеЗаполнения.Договор;
Контрагент = ДанныеЗаполнения.Контрагент;
Организация = ДанныеЗаполнения.Организация;
Для Каждого ТекСтрокаТовары Из ДанныеЗаполнения.Товары Цикл
НоваяСтрока = Товары.Добавить();
НоваяСтрока.Количество = ТекСтрокаТовары.Количество;
НоваяСтрока.Номенклатура = ТекСтрокаТовары.Номенклатура;
НоваяСтрока.Склад = ТекСтрокаТовары.Склад;
НоваяСтрока.Сумма = ТекСтрокаТовары.Сумма;
НоваяСтрока.Цена = ТекСтрокаТовары.Цена;
КонецЦикла;
КонецЕсли;
//}}__КОНСТРУКТОР_ВВОД_НА_ОСНОВАНИИ
КонецПроцедуры
6. В формах списка и документа обоих документов появилась на командной панели команда “Создать на основании – Реализация товаров и услуг”;
7. Добавляем Реквизит “РодительскийДокумент” составного типа “ДокументСсылка.ПоступлениеТоваровИУслуг; ДокументСсылка.РеализацияТоваровИУслуг”;
8. Добавляем в процедуру “ОбработкаЗаполнения()” строчку:
РодительскийДокумент = ДанныеЗаполнения;
9. Добавляем реквизит “РодительскийДокумент” только для просмотра на форму документа, тестируем.
Реквизит заполняется, однако странное поведение наблюдается по функциональной опции “УчетПоСкладам” –
он то виден, то не виден в форме, хотя ФО привязана к другим атрибутам.
10. Создаем команду “Структура подчиненности”
11. В панель навигации формы документа “ПоступлениеТоваровИУслуг” не лезет почему-то, поэтому в командную панель
12. Создаем общую форму “ФормаСтруктураПодчиненности” с деревом значений с полем “Документ”
13. Создаем вызов её из команды “СтруктураПодчиненности” документа “ПоступлениеТоваровИУслуг” с передачей параметра – ссылки на документ
15. Копируем реквизит “РодительскийДокумент” в документ “ПоступлениеТоваровИУслуг”
16. Двойной щелчок по документу “Поступление товаров и услуг” – вкладка “Ввод на основании”;
17. Вводится на основании – выбираем “Документ.ПоступлениеТоваровИУслуг” и “Документ.РеализацияТоваровИУслуг”;
18. Нажимаем кнопку “Конструктор ввода на основании”;
19. Для обоих объектов жмем “Заполнить выражение”, убираем только “РодительскийДокумент”;
20. Жмем “ОК”, формируется код, добавляем туда еще строчку для заполнения родительского документа текущим:
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
//{{__КОНСТРУКТОР_ВВОД_НА_ОСНОВАНИИ
// Данный фрагмент построен конструктором.
// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
РодительскийДокумент = ДанныеЗаполнения;
Если ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.ПоступлениеТоваровИУслуг") Тогда
// Заполнение шапки
Договор = ДанныеЗаполнения.Договор;
Комментарий = ДанныеЗаполнения.Комментарий;
Контрагент = ДанныеЗаполнения.Контрагент;
Организация = ДанныеЗаполнения.Организация;
Склад = ДанныеЗаполнения.Склад;
Для Каждого ТекСтрокаВыгрузка Из ДанныеЗаполнения.Выгрузка Цикл
НоваяСтрока = Выгрузка.Добавить();
НоваяСтрока.Узел = ТекСтрокаВыгрузка.Узел;
КонецЦикла;
Для Каждого ТекСтрокаТовары Из ДанныеЗаполнения.Товары Цикл
НоваяСтрока = Товары.Добавить();
НоваяСтрока.Количество = ТекСтрокаТовары.Количество;
НоваяСтрока.Номенклатура = ТекСтрокаТовары.Номенклатура;
НоваяСтрока.Сумма = ТекСтрокаТовары.Сумма;
НоваяСтрока.Цена = ТекСтрокаТовары.Цена;
КонецЦикла;
ИначеЕсли ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.РеализацияТоваровИУслуг") Тогда
// Заполнение шапки
Договор = ДанныеЗаполнения.Договор;
Контрагент = ДанныеЗаполнения.Контрагент;
Организация = ДанныеЗаполнения.Организация;
Для Каждого ТекСтрокаТовары Из ДанныеЗаполнения.Товары Цикл
НоваяСтрока = Товары.Добавить();
НоваяСтрока.Количество = ТекСтрокаТовары.Количество;
НоваяСтрока.Номенклатура = ТекСтрокаТовары.Номенклатура;
НоваяСтрока.Сумма = ТекСтрокаТовары.Сумма;
НоваяСтрока.Цена = ТекСтрокаТовары.Цена;
КонецЦикла;
КонецЕсли;
//}}__КОНСТРУКТОР_ВВОД_НА_ОСНОВАНИИ
КонецПроцедуры
21. В формы списка добавляем колонку для отобажения родительского документа, тестируем – всё ОК!
22. Про критерии отбора не понял, что это и зачем
23. Авторазворот – добавляем строчку в процедуру формирования формы:
Все материалы этого сайта являются составной частью Базового / Продвинутого курсов по программированию - и являются объектами авторского и имущественного права.
Любое их распространение без письменного согласования с авторами запрещено.
1. Двойной щелчок по документу “Реализация товаров и услуг” – вкладка “Ввод на основании”;
2. Вводится на основании – выбираем “Документ.ПоступлениеТоваровИУслуг” и “Документ.РеализацияТоваровИУслуг”;
3. Нажимаем кнопку “Конструктор ввода на основании”;
4. Для обоих объектов жмем “Заполнить выражение” – всё заполнилось кроме склада для поступления;
5. Выбираем Склад из шапки документа “ПоступлениеТоваровИУслуг”, жмем “ОК”, формируется код:
//{{__КОНСТРУКТОР_ВВОД_НА_ОСНОВАНИИ
// Данный фрагмент построен конструктором.
// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
Если ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.ПоступлениеТоваровИУслуг") Тогда
// Заполнение шапки
Договор = ДанныеЗаполнения.Договор;
Контрагент = ДанныеЗаполнения.Контрагент;
Организация = ДанныеЗаполнения.Организация;
Для Каждого ТекСтрокаТовары Из ДанныеЗаполнения.Товары Цикл
НоваяСтрока = Товары.Добавить();
НоваяСтрока.Количество = ТекСтрокаТовары.Количество;
НоваяСтрока.Номенклатура = ТекСтрокаТовары.Номенклатура;
НоваяСтрока.Сумма = ТекСтрокаТовары.Сумма;
НоваяСтрока.Цена = ТекСтрокаТовары.Цена;
КонецЦикла;
ИначеЕсли ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.РеализацияТоваровИУслуг") Тогда
// Заполнение шапки
Договор = ДанныеЗаполнения.Договор;
Контрагент = ДанныеЗаполнения.Контрагент;
Организация = ДанныеЗаполнения.Организация;
Для Каждого ТекСтрокаТовары Из ДанныеЗаполнения.Товары Цикл
НоваяСтрока = Товары.Добавить();
НоваяСтрока.Количество = ТекСтрокаТовары.Количество;
НоваяСтрока.Номенклатура = ТекСтрокаТовары.Номенклатура;
НоваяСтрока.Склад = ТекСтрокаТовары.Склад;
НоваяСтрока.Сумма = ТекСтрокаТовары.Сумма;
НоваяСтрока.Цена = ТекСтрокаТовары.Цена;
КонецЦикла;
КонецЕсли;
//}}__КОНСТРУКТОР_ВВОД_НА_ОСНОВАНИИ
КонецПроцедуры
6. В формах списка и документа обоих документов появилась на командной панели команда “Создать на основании – Реализация товаров и услуг”;
7. Добавляем Реквизит “РодительскийДокумент” составного типа “ДокументСсылка.ПоступлениеТоваровИУслуг; ДокументСсылка.РеализацияТоваровИУслуг”;
8. Добавляем в процедуру “ОбработкаЗаполнения()” строчку:
9. Добавляем реквизит “РодительскийДокумент” только для просмотра на форму документа, тестируем.
Реквизит заполняется, однако странное поведение наблюдается по функциональной опции “УчетПоСкладам” –
он то виден, то не виден в форме, хотя ФО привязана к другим атрибутам.
10. Создаем команду “Структура подчиненности”
11. В панель навигации формы документа “ПоступлениеТоваровИУслуг” не лезет почему-то, поэтому в командную панель
12. Создаем общую форму “ФормаСтруктураПодчиненности” с деревом значений с полем “Документ”
13. Создаем вызов её из команды “СтруктураПодчиненности” документа “ПоступлениеТоваровИУслуг” с передачей параметра – ссылки на документ
Процедура СтруктураПодчиненности(Команда)
ОткрытьФорму("ОбщаяФорма.ФормаСтруктураПодчиненности",Новый Структура("Док",Объект.Ссылка));
КонецПроцедуры
14. Вставляем обработчик формы “ФормаСтруктураПодчиненности”
Процедура ДобавитьДокументы(УДЗ) // УДЗ – Узел дерева значений
Запрос.Текст =
"ВЫБРАТЬ
| РеализацияТоваровИУслуг.Ссылка
|ИЗ
| Документ.РеализацияТоваровИУслуг КАК РеализацияТоваровИУслуг
|ГДЕ
| РеализацияТоваровИУслуг.РодительскийДокумент = &РодительскийДокумент";
Запрос.УстановитьПараметр("РодительскийДокумент", УДЗ.Документ);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Если ВыборкаДетальныеЗаписи.Количество()>0 Тогда
ДЗ = УДЗ.ПолучитьЭлементы();
КонецЕсли;
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
З = ДЗ.Добавить();
З.Документ = ВыборкаДетальныеЗаписи.Ссылка;
ДобавитьДокументы(З);
КонецЦикла;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПоступлениеТоваровИУслуг.Ссылка
|ИЗ
| Документ.ПоступлениеТоваровИУслуг КАК ПоступлениеТоваровИУслуг
|ГДЕ
| ПоступлениеТоваровИУслуг.РодительскийДокумент = &РодительскийДокумент";
Запрос.УстановитьПараметр("РодительскийДокумент", УДЗ.Документ);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Если ВыборкаДетальныеЗаписи.Количество()>0 Тогда
ДЗ = УДЗ.ПолучитьЭлементы();
КонецЕсли;
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
З = ДЗ.Добавить();
З.Документ = ВыборкаДетальныеЗаписи.Ссылка;
ДобавитьДокументы(З);
КонецЦикла;
КонецПроцедуры
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ДЗ = СтруктураПодчиненности.ПолучитьЭлементы();
З = ДЗ.Добавить();
З.Документ = Параметры.Док;
ДобавитьДокументы(З);
КонецПроцедуры
15. Копируем реквизит “РодительскийДокумент” в документ “ПоступлениеТоваровИУслуг”
16. Двойной щелчок по документу “Поступление товаров и услуг” – вкладка “Ввод на основании”;
17. Вводится на основании – выбираем “Документ.ПоступлениеТоваровИУслуг” и “Документ.РеализацияТоваровИУслуг”;
18. Нажимаем кнопку “Конструктор ввода на основании”;
19. Для обоих объектов жмем “Заполнить выражение”, убираем только “РодительскийДокумент”;
20. Жмем “ОК”, формируется код, добавляем туда еще строчку для заполнения родительского документа текущим:
//{{__КОНСТРУКТОР_ВВОД_НА_ОСНОВАНИИ
// Данный фрагмент построен конструктором.
// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
РодительскийДокумент = ДанныеЗаполнения;
Если ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.ПоступлениеТоваровИУслуг") Тогда
// Заполнение шапки
Договор = ДанныеЗаполнения.Договор;
Комментарий = ДанныеЗаполнения.Комментарий;
Контрагент = ДанныеЗаполнения.Контрагент;
Организация = ДанныеЗаполнения.Организация;
Склад = ДанныеЗаполнения.Склад;
Для Каждого ТекСтрокаВыгрузка Из ДанныеЗаполнения.Выгрузка Цикл
НоваяСтрока = Выгрузка.Добавить();
НоваяСтрока.Узел = ТекСтрокаВыгрузка.Узел;
КонецЦикла;
Для Каждого ТекСтрокаТовары Из ДанныеЗаполнения.Товары Цикл
НоваяСтрока = Товары.Добавить();
НоваяСтрока.Количество = ТекСтрокаТовары.Количество;
НоваяСтрока.Номенклатура = ТекСтрокаТовары.Номенклатура;
НоваяСтрока.Сумма = ТекСтрокаТовары.Сумма;
НоваяСтрока.Цена = ТекСтрокаТовары.Цена;
КонецЦикла;
ИначеЕсли ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.РеализацияТоваровИУслуг") Тогда
// Заполнение шапки
Договор = ДанныеЗаполнения.Договор;
Контрагент = ДанныеЗаполнения.Контрагент;
Организация = ДанныеЗаполнения.Организация;
Для Каждого ТекСтрокаТовары Из ДанныеЗаполнения.Товары Цикл
НоваяСтрока = Товары.Добавить();
НоваяСтрока.Количество = ТекСтрокаТовары.Количество;
НоваяСтрока.Номенклатура = ТекСтрокаТовары.Номенклатура;
НоваяСтрока.Сумма = ТекСтрокаТовары.Сумма;
НоваяСтрока.Цена = ТекСтрокаТовары.Цена;
КонецЦикла;
КонецЕсли;
//}}__КОНСТРУКТОР_ВВОД_НА_ОСНОВАНИИ
КонецПроцедуры
21. В формы списка добавляем колонку для отобажения родительского документа, тестируем – всё ОК!
22. Про критерии отбора не понял, что это и зачем
23. Авторазворот – добавляем строчку в процедуру формирования формы:
Здравствуйте!
Обработка СтруктураПодчиненности Модуль формы:
Процедура ЗаполнитьДеревоНаСервереБезКонтекста(Дер, КореньДерева, ДокСсылка)
фЭлНайден = КореньДерева.Строки.Найти(ДокСсылка, "ДокСсылка", Истина);
НовСтрока = Дер.Строки.Добавить();
НовСтрока.ДокСсылка = ДокСсылка;
Если фЭлНайден <> Неопределено Тогда
Возврат;
КонецЕсли;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| КритерийОтбораСтруктураПодчиненности.Ссылка
|ИЗ
| КритерийОтбора.КритерийОтбораСтруктураПодчиненности(&ДокСсылка) КАК КритерийОтбораСтруктураПодчиненности";
Запрос.УстановитьПараметр("ДокСсылка", ДокСсылка);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
ЗаполнитьДеревоНаСервереБезКонтекста(НовСтрока, КореньДерева, ВыборкаДетальныеЗаписи.Ссылка);
КонецЦикла;
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьНаСервере()
мДок = Новый Массив;
ДокКореньДерева = ДокОснования;
Пока ЗначениеЗаполнено(ДокКореньДерева.Основание) Цикл
фЭлНайден = мДок.Найти(ДокКореньДерева);
мДок.Добавить(ДокКореньДерева);
ДокКореньДерева = ДокКореньДерева.Основание;
Если фЭлНайден <> Неопределено Тогда
Прервать;
КонецЕсли;
КонецЦикла;
КореньДерева = Новый ДеревоЗначений;
КореньДерева.Колонки.Добавить("ДокСсылка");
ДерСтрока = КореньДерева;
ЗаполнитьДеревоНаСервереБезКонтекста(ДерСтрока, КореньДерева, ДокКореньДерева);
ЗначениеВРеквизитФормы(ДерСтрока, "Дер");
КонецПроцедуры
&НаКлиенте
Процедура Заполнить(Команда)
ЗаполнитьНаСервере();
РазвернутьДерево();
КонецПроцедуры
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ФСформировать = Параметры.Свойство("Док", ДокОснования);
Если фСформировать Тогда
ЗаполнитьНаСервере();
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПриОткрытии(Отказ)
РазвернутьДерево();
КонецПроцедуры
&НаКлиенте
Процедура РазвернутьДерево()
Для Каждого Эл Из Дер.ПолучитьЭлементы() Цикл
Элементы.Дер.Развернуть(Эл.ПолучитьИдентификатор(), Истина);
КонецЦикла;
КонецПроцедуры