Нужно по кнопке Заполнить - сформировать данные для заполнения табличных частей и заполнить их.
Форма имеет вид:
Рядом с кнопкой Записать и закрыть добавлена кнопка Заполнить документ , код ее команды:
Код 1C v 8.2 УП // Код заполнения ТЧ
&НаСервере
Процедура ЗаполнитьДокументНаСервере()
ДокОбъект = РеквизитФормыВЗначение("Объект");
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| ЗаказНаПроизводствоПродукция.Ссылка КАК ЗаказНаПроизводство,
| СпецификацииОперации.Операция,
| СпецификацииОперации.W1C_КоличествоОпераций,
| СпецификацииОперации.W1C_СтоимостьОднойОперации
|ПОМЕСТИТЬ втЗаказОперацияСумма
|ИЗ
| Документ.ЗаказНаПроизводство.Продукция КАК ЗаказНаПроизводствоПродукция
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Спецификации.Операции КАК СпецификацииОперации
| ПО ЗаказНаПроизводствоПродукция.Спецификация = СпецификацииОперации.Ссылка
|ГДЕ
| ЗаказНаПроизводствоПродукция.Ссылка В
| (ВЫБРАТЬ РАЗЛИЧНЫЕ
| W1C_ОтчетПоВыработкеНачисления.ЗаказПроизводство
| ИЗ
| Документ.W1C_ОтчетПоВыработке.Начисления КАК W1C_ОтчетПоВыработкеНачисления
| ГДЕ
| W1C_ОтчетПоВыработкеНачисления.Ссылка.Дата МЕЖДУ &ДатаН И &ДатаК)
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| W1C_ОтчетПоВыработкеНачисления.Ссылка.Организация,
| W1C_ОтчетПоВыработкеНачисления.Ссылка.Сотрудник,
| W1C_ОтчетПоВыработкеНачисления.ЗаказПроизводство,
| W1C_ОтчетПоВыработкеНачисления.Операция,
| W1C_ОтчетПоВыработкеНачисления.КоличествоПродукции КАК Количество,
| втЗаказОперацияСумма.W1C_СтоимостьОднойОперации КАК Цена,
| W1C_ОтчетПоВыработкеНачисления.Ссылка КАК ОтчетПоВыработке,
| втЗаказОперацияСумма.W1C_СтоимостьОднойОперации * W1C_ОтчетПоВыработкеНачисления.КоличествоПродукции КАК Сумма
|ИЗ
| Документ.W1C_ОтчетПоВыработке.Начисления КАК W1C_ОтчетПоВыработкеНачисления
| ЛЕВОЕ СОЕДИНЕНИЕ втЗаказОперацияСумма КАК втЗаказОперацияСумма
| ПО W1C_ОтчетПоВыработкеНачисления.ЗаказПроизводство = втЗаказОперацияСумма.ЗаказНаПроизводство
| И W1C_ОтчетПоВыработкеНачисления.Операция = втЗаказОперацияСумма.Операция
|ГДЕ
| W1C_ОтчетПоВыработкеНачисления.Ссылка.Дата МЕЖДУ &ДатаН И &ДатаК
| И W1C_ОтчетПоВыработкеНачисления.Ссылка.Организация = &Организация";
Запрос.УстановитьПараметр("ДатаК", КонецМесяца(ДокОбъект.ПериодРегистрации));
Запрос.УстановитьПараметр("ДатаН", НачалоМесяца(ДокОбъект.ПериодРегистрации));
Запрос.УстановитьПараметр("Организация", ДокОбъект.Организация);
РезультатЗапроса = Запрос.Выполнить();
ДокОбъект.Рассчет.Загрузить(Запрос.Выполнить().Выгрузить());
ОбновитьВыплату(ДокОбъект); //заполним данными вторую ТЧ
ЗначениеВРеквизитФормы(ДокОбъект, "Объект");
КонецПроцедуры
&НаСервере
Процедура ОбновитьВыплату(ДокОбъект)
врТЗ = ДокОбъект.Рассчет.Выгрузить();
врТЗ.свернуть("Сотрудник","Сумма");
ДокОбъект.Начисления.Загрузить(врТЗ);
КонецПроцедуры
Второй вариант заполнения: Имеем ТЧ на форме, которую необходимо программно заполнить
и код в модуле документа:
Код 1C v 8.2 УП &НаСервере
Процедура НайтиТопливоф()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СУММА(ПродажаТоплива.Номер) КАК Номер,
| ПродажаТоплива.ТипТоплива,
| СУММА(ПродажаТоплива.Количество) КАК Количество,
| СУММА(ПродажаТоплива.СуммаСНДС) КАК СуммаСНДС
|ИЗ
| Документ.ПродажаТоплива КАК ПродажаТоплива
|ГДЕ
| ПродажаТоплива.Цена <= &Цена
|
|СГРУППИРОВАТЬ ПО
| ПродажаТоплива.ТипТоплива";
Запрос.УстановитьПараметр("Цена", Объект.Цена);
Результат = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = Результат.Выбрать();
Объект.ТЧ.Очистить();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
НовСтр = Объект.ТЧ.Добавить();
ЗаполнитьЗначенияСвойств(НовСтр, ВыборкаДетальныеЗаписи); //при условии что имена полей ТЧ и выборки совпадают
КонецЦикла;
КонецПроцедуры
Есть ли в 8.х аналог ИспользоватьСписокЭлементов?
В динамических списках документов, справочников и т.д. может быть программно установлен отбор по полю Ссылка с указанием в качестве вида сравнения вхождения в список значений. Это позволяет отображать в списке только определенные объекты.
Однако эта возможность может иметь только ограниченное применение, так как динамический список имеет достаточно большое количество универсальных возможностей (установка отбора пользователем, переходы по уровням в иерархических списках и т.д.) и совмещение в прикладных решениях этих механизмов с отбором по конкретным значениям ссылок достаточно сложно реализуется.
В большинстве случаев, если необходимо обеспечить отображение в списке специально отобранного перечня объектов, можно рекомендовать использовать другие возможности (например, выборку данных запросом и отображение в форме с помощью таблицы значений или табличного документа). При этом система обеспечивает возможность полноценного взаимодействия с такими формами других системных механизмов.
Код 1C v 8.х Запрос = Новый Запрос();
Запрос.Текст = " ВЫБРАТЬ
| СпецификацииНоменклатуры.Ссылка
|ИЗ
| Справочник.СпецификацииНоменклатуры КАК СпецификацииНоменклатуры
|ГДЕ
| СпецификацииНоменклатуры.Владелец.Ссылка = &НоменклатураСсылка
| И СпецификацииНоменклатуры.Организация В ИЕРАРХИИ (&Организация)";
Запрос.УстановитьПараметр("НоменклатураСсылка", ГотоваяПродукция);
Запрос.УстановитьПараметр("Организация", Организация);
СписокСпецификаций = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка");
ФормаВыбора = Справочники.СпецификацииНоменклатуры.ПолучитьФормуВыбора(,Элемент,Элемент);
ЭлементОтбора = ФормаВыбора.СправочникСписок.Отбор.Ссылка;
ЭлементОтбора.ВидСравнения = ВидСравнения.ВСписке;
ЭлементОтбора.Значение = СписокСпецификаций;
ЭлементОтбора.Использование = Истина;
ФормаВыбора.ЭлементыФормы.СправочникСписок.НастройкаОтбора.Ссылка.Доступность = Ложь;
ФормаВыбора.Открыть();
Код 1C v 8.2 УП &НаКлиенте
Процедура ПоУмолчаниюОпцияНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ФормаВыбора = ПолучитьФорму("Справочник.ОпцииАвтомобилей.Форма.ФормаВыбора");
ФормаВыбора.Открыть();
ЭлементОтбора = ФормаВыбора.Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Ссылка");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке;
ЭлементОтбора.ПравоеЗначение = СписокОпций;
ЭлементОтбора.Использование = Истина;
КонецПроцедуры
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
//считаем данные по опциям доступной для данной модели
СписокОпций.ЗагрузитьЗначения(Объект.Владелец.ОпцииМодели.Выгрузить().ВыгрузитьКолонку("Опция"));
КонецПроцедуры
Для 7.7 используем метод ИспользоватьСписокЭлементов
Автор:
Antoska
Для решения данной задачи я решил воспользоваться методом формы списка "ИспользоватьСписокЭлементов(<СписокЗначений>)", так как использование процедуры "ОбработкаПодбора()" требует наличия реквизита справочника для отбора, а это мне не очень подходит. Вот как я реализовал этот алгоритм (код из модуля формы списка справочника):
Код 1C v 7.x Функция СоответствуетУсловиямФильтра(ЭлементСправочника)
Если ПустоеЗначение(ЭлементСправочника) = 0 Тогда
//Условие фильтра: текущий остаток не равен нулю
Если Регистр.ПартииТоваров.СводныйОстаток("",ЭлементСправочника.ТекущийЭлемент(),,,,,"ОстатокТовара") <> 0 Тогда
Возврат 1;
КонецЕсли;
КонецЕсли;
Возврат 0;
КонецФункции
Процедура УстановитьФильтр(Знач Группа="", Знач Иерархия="")
//Для флажка Фильтр задана формула "УстановитьФильтр()"
Если Фильтр = 1 Тогда
//Определяем параметры процедуры
Группа = ?(Группа="",ТекущийЭлемент().Родитель,Группа);
Иерархия = ?(Иерархия="",ИерархическийСписок(),Иерархия);
СписокФильтра = СоздатьОбъект("СписокЗначений");
Спр = СоздатьОбъект("Справочник.Номенклатура");
//Определяемся с использованием родителя при выборке элементов
Если ПустоеЗначение(Группа) = 0 Тогда
Спр.ИспользоватьРодителя(Группа);
КонецЕсли;
Спр.ВключатьПодчиненные(0);
//Выбираем элементы с учётом иерархии
Спр.ВыбратьЭлементы(Иерархия);
Пока Спр.ПолучитьЭлемент() = 1 Цикл
//Показваем группы, для удобства навигации
Если Спр.ЭтоГруппа() = 1 Тогда
//Добавляем группу в список фильтра
СписокФильтра.ДобавитьЗначение(Спр.ТекущийЭлемент());
Продолжить;
КонецЕсли;
//Проверяем элемент на соответствие условиям фильтра
Если СоответствуетУсловиямФильтра(Спр.ТекущийЭлемент()) = 1 Тогда
//Добавляем элемент в список фильтра
СписокФильтра.ДобавитьЗначение(Спр.ТекущийЭлемент());
КонецЕсли;
КонецЦикла;
//Устанавливаем фильтр
ИспользоватьСписокЭлементов(СписокФильтра);
Иначе
//Снимаем фильтр
ИспользоватьСписокЭлементов();
КонецЕсли;
КонецПроцедуры
Процедура ПриВыбореРодителя(Элемент)
УстановитьФильтр(Элемент)
КонецПроцедуры
Процедура ПриСменеИерархии(Способ)
УстановитьФильтр(,Способ)
КонецПроцедуры
Функцией "СоответствуетУсловиямФильтра(ЭлементСправочника)" можно задавать любые условия фильтрации списка опираясь на передаваемый ей элемент справочника.
Скорость работы приемлема, но можно попробовать реализовать и через запрос...