Добавление в структуру подчиненности для документа Поступление товаров и услуг документа Требование-накладная

08.08.25

Задачи пользователя - Адаптация типовых решений

На основании документа Поступление товаров и услуг можно ввести множество документов, включая "Расход материалов" (документ Требование-накладная), но в структуре подчиненности отражаются далеко не все документы, созданные на основании. Данное решение позволяет исправить это. Добавляем в структуру подчиненности Поступления товаров и услуг документ Требование-накладная через расширение.

Файлы

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование Скачано Купить файл
(только для физ. лиц)
Добавление в структуру подчиненности для документа Поступление товаров и услуг документа Требование-накладная:
.cfe 60,00Kb
0 1 850 руб. Купить

Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний

Оформите подписку на компанию для решения рабочих задач

Оформить подписку и скачать решение со скидкой

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

Итак, задача:
Добавить в структуру подчиненности документ "Расход материалов", созданный на основании документа "Поступление товаров и услуг". Без изменения конфигурации.

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

 

Решение:

1. Заимствуем документ Требование-накладная в наше расширение, добавляем реквизит ТН_ДокументОбъект (тип: ДокументСсылка.ПоступлениеТоваровУслуг), в который будем записывать документ-основание. Если хотите иметь возможность проставить этот реквизит в уже существующих требованиях, тогда его можно вынести на форму:

 

 

2. В модуле документа "Требование-накладная" необходимо дополнить процедуру "ЗаполнитьПоДокументуОснованию" указанием документа-основания в наш созданный реквизит. 

Я использовал аннотации &ИзменениеИКонтроль, они позволяют работать с процедурами основной конфигурации, не переписывая каждый раз их полностью, а дополнять (или убирать "лишнее") с контролем остального кода платформой. Для того чтобы добавить процедуру в расширение нужно правой кнопкой щелкнуть на процедуре, выбрать "Добавить в расширение" и выбрать способ, в моем случае это "Вызывать вместо (с контролем)".

 

 

Далее мы делаем вставку нашего дополнительного кода, при условии что заполнение идет по документу Поступление товаров и услуг:

	Если ТипЗнч(Основание) = Тип("ДокументСсылка.ПоступлениеТоваровУслуг") Тогда

		// Заполним реквизиты из стандартного набора по документу основанию.
		ЗаполнениеДокументов.ЗаполнитьПоОснованию(ЭтотОбъект, Основание);

		ПодразделениеОрганизации = Основание.ПодразделениеОрганизации;
		Если Основание.ВидОперации = Перечисления.ВидыОперацийПоступлениеТоваровУслуг.ВПереработку Тогда
			Контрагент = Основание.Контрагент;
			ИмяТаблицы	= "МатериалыЗаказчика";
		Иначе
			ИмяТаблицы	= "Материалы";
		КонецЕсли;

		ДанныеОбъекта = Новый Структура("Дата, Организация, Склад");
		ЗаполнитьЗначенияСвойств(ДанныеОбъекта, ЭтотОбъект);

		Для Каждого ТекСтрокаТовары Из Основание.Товары Цикл

			СтрокаТабличнойЧасти                  = ЭтотОбъект[ИмяТаблицы].Добавить();
			СтрокаТабличнойЧасти.Номенклатура     = ТекСтрокаТовары.Номенклатура;
			СтрокаТабличнойЧасти.Количество       = ТекСтрокаТовары.Количество;
			СтрокаТабличнойЧасти.ЕдиницаИзмерения = ТекСтрокаТовары.ЕдиницаИзмерения;
			СтрокаТабличнойЧасти.КоличествоМест   = ТекСтрокаТовары.КоличествоМест;
			СтрокаТабличнойЧасти.Коэффициент      = ТекСтрокаТовары.Коэффициент;

			Если ИмяТаблицы	= "Материалы" Тогда
				СтрокаТабличнойЧасти.ОтражениеВУСН = Перечисления.ОтражениеВУСН.Принимаются;
			КонецЕсли;

		КонецЦикла;
		#Вставка
		//ТН
		ЭтотОбъект.ТН_ДокументОбъект = Основание;
		//!ТН
		#КонецВставки
	ИначеЕсли ТипЗнч(Основание) = Тип("ДокументСсылка.АвансовыйОтчет") Тогда
	...

 

3. Заимствуем в расширение общую форму "СвязанныеДокументы" и вносим корректировки в существующие процедуры. Нам необходимо скорректировать, а точнее добавить в перечень объектов, которые проверяются в момент выведения родительских и дочерних элементов, свой документ Требование-накладная, соответствующее отбору по документу-основанию.

Аналогичным способом п.2. получаем процедуры в расширение с контролем изменения и вносим следующие правки:

Для выведения родителя документа требование-накладная нужно добавить непосредственно ссылку из самого документа

&НаСервере
&ИзменениеИКонтроль("ВывестиРодительскиеОбъекты")
Процедура ТН_ВывестиРодительскиеОбъекты(ТекущийОбъект, ДеревоРодитель, ВыведенныеОбъекты, СлужебныеОбъекты, ИндексСвязейОбъектов)

	МетаданныеОбъекта = ТекущийОбъект.Метаданные();
	СписокРеквизитов  = Новый Массив;

	Если СлужебныеОбъекты = Неопределено Тогда 
		СлужебныеОбъекты = Новый Соответствие;
	КонецЕсли;

	Если ИндексСвязейОбъектов = Неопределено Тогда 
		ИндексСвязейОбъектов = Новый Соответствие;
	КонецЕсли;

	ВестиУчетПоДоговорам = ПолучитьФункциональнуюОпцию("ВестиУчетПоДоговорам");

	Для Каждого Реквизит Из МетаданныеОбъекта.Реквизиты Цикл

		Если Не Метаданные.КритерииОтбора.СвязанныеДокументы.Состав.Содержит(Реквизит) Тогда
			Продолжить;
		КонецЕсли;

		Для Каждого ТекущийТип Из Реквизит.Тип.Типы() Цикл

			МетаданныеРеквизита = МетаданныеТипаРеквизита(ТекущийТип);
			Если МетаданныеРеквизита.Метаданные = Неопределено Тогда
				Продолжить;
			КонецЕсли;

			Если ЭтоСсылкаНаДоговор(ТекущийТип)
				И (ТекущийОбъект <> ОсновнойОбъект
				Или Не ВестиУчетПоДоговорам) Тогда
				Продолжить;
			КонецЕсли;

			ЗначениеРеквизита = ТекущийОбъект[Реквизит.Имя];
			Если ЗначениеЗаполнено(ЗначениеРеквизита)
				И ТипЗнч(ЗначениеРеквизита) = ТекущийТип
				И ЗначениеРеквизита <> ТекущийОбъект
				И СписокРеквизитов.Найти(ЗначениеРеквизита) = Неопределено Тогда

				СписокРеквизитов.Добавить(ЗначениеРеквизита);
			КонецЕсли;
		КонецЦикла;

	КонецЦикла;

	Для Каждого ТабличнаяЧасть Из МетаданныеОбъекта.ТабличныеЧасти Цикл

		ИменаРеквизитов = "";
		СодержимоеТЧ = ТекущийОбъект[ТабличнаяЧасть.Имя].Выгрузить(); // ТаблицаЗначений
		Для Каждого Реквизит Из ТабличнаяЧасть.Реквизиты Цикл

			Если Не Метаданные.КритерииОтбора.СвязанныеДокументы.Состав.Содержит(Реквизит) Тогда
				Продолжить;
			КонецЕсли;

			Для Каждого ТекущийТип Из Реквизит.Тип.Типы() Цикл
				МетаданныеРеквизита = МетаданныеТипаРеквизита(ТекущийТип);
				Если МетаданныеРеквизита.Метаданные = Неопределено Тогда
					Продолжить;
				КонецЕсли;  

				Если ЭтоСсылкаНаДоговор(ТекущийТип)
					И (ТекущийОбъект <> ОсновнойОбъект
					Или Не ВестиУчетПоДоговорам) Тогда
					Продолжить;
				КонецЕсли;

				ИменаРеквизитов = ИменаРеквизитов + ?(ИменаРеквизитов = "", "", ", ") + Реквизит.Имя;
				Прервать;
			КонецЦикла;

		КонецЦикла;

		СодержимоеТЧ.Свернуть(ИменаРеквизитов);
		Для Каждого КолонкаТЧ Из СодержимоеТЧ.Колонки Цикл

			Для Каждого СтрокаТЧ Из СодержимоеТЧ Цикл

				ЗначениеРеквизита = СтрокаТЧ[КолонкаТЧ.Имя];
				МетаданныеЗначения = МетаданныеТипаРеквизита(ТипЗнч(ЗначениеРеквизита));
				Если МетаданныеЗначения.Метаданные = Неопределено Тогда
					Продолжить;
				КонецЕсли;

				Если ЗначениеРеквизита = ТекущийОбъект
					Или СписокРеквизитов.Найти(ЗначениеРеквизита) <> Неопределено Тогда
					Продолжить;
				КонецЕсли;

				СписокРеквизитов.Добавить(ЗначениеРеквизита);
			КонецЦикла;
		КонецЦикла;
	КонецЦикла;
	
	#Вставка
	//Добавим родителя для требования-накладной
	Если ТипЗнч(ТекущийОбъект) = Тип("ДокументСсылка.ТребованиеНакладная") Тогда
		СписокРеквизитов.Добавить(ТекущийОбъект.ТН_ДокументОбъект);
	КонецЕсли;
	#КонецВставки
...

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

&НаСервере
&ИзменениеИКонтроль("ОбъектыПоКритериюОтбора")
Функция ТН_ОбъектыПоКритериюОтбора(ЗначениеКритерияОтбора)

	ШаблонЗапроса = "ВЫБРАТЬ РАЗРЕШЕННЫЕ
	|	ПсевдонимТаблицы.Ссылка КАК Ссылка
	|ИЗ
	|	ИмяТаблицы КАК ПсевдонимТаблицы
	|ГДЕ
	|	ПсевдонимТаблицы.ИмяРеквизита = &ЗначениеКритерияОтбора";

	ШаблонЗапросаОбъединения = "ВЫБРАТЬ
	|	ПсевдонимТаблицы.Ссылка КАК Ссылка
	|ИЗ
	|	ИмяТаблицы КАК ПсевдонимТаблицы
	|ГДЕ
	|	ПсевдонимТаблицы.ИмяРеквизита = &ЗначениеКритерияОтбора";

	ЧастиЗапроса = Новый Массив;
	ТекстЧастиЗапроса = "";

	Для Каждого ЭлементСостава Из Метаданные.КритерииОтбора.СвязанныеДокументы.Состав Цикл

		Если НЕ ЭлементСостава.Тип.СодержитТип(ТипЗнч(ЗначениеКритерияОтбора)) Тогда
			Продолжить;
		КонецЕсли;

		ПутьКДанным = ЭлементСостава.ПолноеИмя();

		Если СтрНайти(ПутьКДанным, "ТабличнаяЧасть") Тогда
			ОбъектМетаданных = ЭлементСостава.Родитель().Родитель();
		Иначе
			ОбъектМетаданных = ЭлементСостава.Родитель();
		КонецЕсли;

		Если НЕ ПравоДоступа("Чтение", ОбъектМетаданных) Тогда
			Продолжить;
		КонецЕсли;

		Точка = СтрНайти(ПутьКДанным, ".", НаправлениеПоиска.СКонца);
		ИмяРеквизита = Сред(ПутьКДанным, Точка + 1);

		ИмяТаблицы = ЭлементСостава.Родитель().ПолноеИмя();
		ИмяТаблицы = СтрЗаменить(ИмяТаблицы, "ТабличнаяЧасть.", "");

		Точка = СтрНайти(ИмяТаблицы, ".", НаправлениеПоиска.СКонца);
		ПсевдонимТаблицы = "Таблица_" + Сред(ИмяТаблицы, Точка + 1);

		ТекстЧастиЗапроса = ?(ТекстЧастиЗапроса = "", ШаблонЗапроса, ШаблонЗапросаОбъединения);
		ТекстЧастиЗапроса = СтрЗаменить(ТекстЧастиЗапроса, "ИмяТаблицы", ИмяТаблицы);
		ТекстЧастиЗапроса = СтрЗаменить(ТекстЧастиЗапроса, "ПсевдонимТаблицы", ПсевдонимТаблицы);
		ТекстЧастиЗапроса = СтрЗаменить(ТекстЧастиЗапроса, "ИмяРеквизита", ИмяРеквизита);

		ЧастиЗапроса.Добавить(ТекстЧастиЗапроса);
	КонецЦикла;
	
	#Вставка
	//Добавим в запрос еще документы требования-накладные
	Если ТипЗнч(ЗначениеКритерияОтбора) = Тип("ДокументСсылка.ПоступлениеТоваровУслуг") Тогда
		ТН_ТекстЧастиЗапроса = "ВЫБРАТЬ
		                       |	ТребованиеНакладная.Ссылка КАК Ссылка
		                       |ИЗ
		                       |	Документ.ТребованиеНакладная КАК ТребованиеНакладная
		                       |ГДЕ
		                       |	ТребованиеНакладная.ТН_ДокументОбъект = &ЗначениеКритерияОтбора";
		ЧастиЗапроса.Добавить(ТН_ТекстЧастиЗапроса);
	КонецЕсли;
	#КонецВставки

	Если ЧастиЗапроса.Количество() > 0 Тогда
		Запрос = Новый Запрос;
		Разделитель = Символы.ПС + "ОБЪЕДИНИТЬ" + Символы.ПС;
		Запрос.Текст = СтрСоединить(ЧастиЗапроса, Разделитель);
		Запрос.УстановитьПараметр("ЗначениеКритерияОтбора", ЗначениеКритерияОтбора);
		Возврат Запрос.Выполнить().Выгрузить();
	Иначе
		Возврат Новый ТаблицаЗначений;
	КонецЕсли;

КонецФункции

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

&НаСервере
&ИзменениеИКонтроль("ОбновитьДеревоСтруктурыПодчиненности")
Процедура ТН_ОбновитьДеревоСтруктурыПодчиненности()

	Если Не ОсновнойДокументДоступен() Тогда

		ТекстСообщения = НСтр("ru = 'Документ, для которого сформирован отчет о структуре подчиненности, стал недоступен.'");
		ОбщегоНазначения.СообщитьПользователю(ТекстСообщения);
		Возврат;

	КонецЕсли;

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

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

 

В итоге мы получаем в отчете "Подчиненные документы" свой Расход материалов:

 

Также работает, если вывести для самого расхода или нажать "вывести для текущего":

 

Проверено на следующих конфигурациях и релизах:

  • Бухгалтерия предприятия, редакция 3.0, релизы 3.0.180.14

Вступайте в нашу телеграмм-группу Инфостарт

Структура подчиненности расширение

См. также

Адаптация типовых решений 1С v8.3 1С:Документооборот Россия Платные (руб)

Расширение конфигурации для «1С:Документооборот КОРП», редакция 3.0. позволяет: 1.использовать произвольные табличные части в качестве дополнительных реквизитов к документу; 2 использовать произвольные табличные части в шаблонах в формате docx для автоматического заполнения таблиц.

29400 руб.

29.06.2023    8646    26    15    

35

Печатные формы Адаптация типовых решений Бухгалтер Пользователь 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Платные (руб)

Расширение позволяет вывести в табличном документе факсимиле печати и подписей и/или вывести произвольную картинку из прикреплённых файлов организации для 1С УТ 11.5, КА 2.5, ERP 2.5, УНФ 3, Розница 3. Вывод факсимиле возможен в табличные документы УПД, УКД, Счёт-фактура, ТОРГ-12 и другие. Возможно настроить вывод для любых типовых макетов (Акт сверки, М-15, ТТН), для этого потребуется отредактировать макет и разместить на нём картинки с соответствующими именами, при выводе на печать в размещённые картинки будут выводиться факсимиле из прикреплённых рисунков. Редактирование осуществляется через типовой механизм в пользовательском интерфейсе.

3500 руб.

07.02.2023    9446    100    17    

57

Адаптация типовых решений Бухгалтер 1С v8.3 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бюджетный учет Платные (руб)

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

3840 руб.

13.11.2024    1833    3    4    

4

Адаптация типовых решений Программист 1С v8.3 1С:Бухгалтерия 3.0 1С:Зарплата и Управление Персоналом 3.x Россия Абонемент ($m)

Маленькая заметка (в трех разных масштабах) для тех, кто часто видит окно при входе в ЗУП «Новые сообщения для расшифровки по 1С-Отчетность», которое появляется через 60 секунд после запуска программы, как раз когда вы уже добрались до интересующей вас формы и начали в ней что-то активно делать:

1 стартмани

17.06.2024    6511    79    Znata_PI    8    

22

Адаптация типовых решений Программист Пользователь 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Абонемент ($m)

Каждый из нас сталкивается с ситуацией, когда какой-нибудь менеджер показывает свой Excel и рассказывает, как он что-то из 1С копирует в него, снабжает пояснениями, выделяет цветом и т.д. и т.п. Заканчивается все просьбой сделать вот чтобы также было в 1С. И оказывается такой человек (почти с гарантией) либо лучшим продажником, либо каким-то важным, за все отвечающим, - на ком все держится.

2 стартмани

22.04.2024    6489    dimanich70    17    

22

БСП (Библиотека стандартных подсистем) Адаптация типовых решений Программист 1С v8.3 1С:ERP Управление предприятием 2 Бесплатно (free)

Понадобилось в подменю "Создать на основании" добавить свою команду, которая открывает обработку. В процессе доработок появилась проблема двух подменю "Создать на основании". В статье о том, как решились проблемы.

01.03.2024    14671    dimanich70    11    

26

Адаптация типовых решений Программист 1С v8.3 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 Россия Абонемент ($m)

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

1 стартмани

27.10.2023    5672    44    TempTablesManager    16    

58
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. RustIG 1895 08.08.25 15:26 Сейчас в теме
молодец, я тоже так делал, но раскрывать механизм не стал https://infostart.ru/1c/reports/1238873/
2. crash-16 3 08.08.25 16:05 Сейчас в теме
(1) спс, не все могут скачать, поэтому с кодом. Да и кода тут 10 строчек )
Оставьте свое сообщение