Каталог решений - Добавление колонки Есть проводки во все списки документов в БП 3.0

Добавление колонки Есть проводки во все списки документов в БП 3.0

Добавление колонки Есть проводки во все списки документов в БП 3.0

В наличии

Дополнительная колонка "Проводки" позволяет увидеть проведенные документы, у которых нет проводок

Категория:

Описание

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

Алгоритм простой. При создании формы списка нам нужно вызвать такую процедуру:

// Процедура - Добавляет в запрос списка реквизит "ЕстьПроводки" и выводит его в таблицу на форме
//
// Параметры:
//  Форма	 - УправляемаяФорма - Форма списка документов
//  ИмяРеквизита - Строка - Имя реквизита списка документов
Процедура ДобавитьПризнакПроводокВСписок(Форма, ИмяРеквизита)
	Список = Форма[ИмяРеквизита];
	ИмяТаблицы = Список.ОсновнаяТаблица;
	ПсевдонимПроводок = "ТПроводки";
	Если Список.ПроизвольныйЗапрос тогда
		Схема = Новый СхемаЗапроса();
		Схема.УстановитьТекстЗапроса(Список.ТекстЗапроса);
		
		// Теперь нужно присоединить таблицу проводок
		Если Схема.ПакетЗапросов.Количество() > 1 тогда
			ЗаписьЖурналаРегистрации("Отладка", УровеньЖурналаРегистрации.Примечание, Метаданные.НайтиПоПолномуИмени(Форма.ИмяФормы), ,
				"Не могу добавить признак проводок, т. к. в пакете больше одного запроса.
					|" + Форма.ИмяФормы + ", " + ИмяРеквизита);
			Возврат;
		КонецЕсли;
		
		ЗапросПакета = Схема.ПакетЗапросов[0];
		
		Если ЗапросПакета.Операторы.Количество() > 1 тогда
			ЗаписьЖурналаРегистрации("Отладка", УровеньЖурналаРегистрации.Примечание, Метаданные.НайтиПоПолномуИмени(Форма.ИмяФормы), ,
				"Не могу добавить признак проводок, т. к. в запросе больше одного оператора.
					|" + Форма.ИмяФормы + ", " + ИмяРеквизита);
			Возврат;
		КонецЕсли;
		
		ИндексОператора = 0;
		Оператор = ЗапросПакета.Операторы[ИндексОператора];
		Источник1 = Оператор.Источники[0];
		Если ТипЗнч(Источник1.Источник) <> Тип("ТаблицаСхемыЗапроса") или Источник1.Источник.ИмяТаблицы <> ИмяТаблицы тогда
			ЗаписьЖурналаРегистрации("Отладка", УровеньЖурналаРегистрации.Примечание, Метаданные.НайтиПоПолномуИмени(Форма.ИмяФормы), ,
				"Не могу добавить признак проводок, т. к. первый источник — не основная таблица.
					|" + Форма.ИмяФормы + ", " + ИмяРеквизита);
			Возврат;
		КонецЕсли;
		
		Источник2 = Оператор.Источники.Добавить("РегистрБухгалтерии.Хозрасчетный", ПсевдонимПроводок);
		Источник2.Соединения.Очистить();
		
		ОК = Источник1.Соединения.Добавить(ПсевдонимПроводок,
			Источник1.Источник.Псевдоним + ".Ссылка = " + ПсевдонимПроводок + ".Регистратор И " + ПсевдонимПроводок + ".НомерСтроки = 1");
		Если не ОК тогда
			ЗаписьЖурналаРегистрации("Отладка", УровеньЖурналаРегистрации.Примечание, Метаданные.НайтиПоПолномуИмени(Форма.ИмяФормы), ,
				"Не могу добавить признак проводок, т. к. не удалось добавить соединение.
					|" + Форма.ИмяФормы + ", " + ИмяРеквизита);
			Возврат;
		КонецЕсли;
		Источник1.Соединения[Источник1.Соединения.Количество()-1].ТипСоединения = ТипСоединенияСхемыЗапроса.ЛевоеВнешнее;
		
		Выражение = Оператор.ВыбираемыеПоля.Добавить("ВЫБОР КОГДА ТПроводки.НомерСтроки ЕСТЬ NULL ТОГДА ЛОЖЬ ИНАЧЕ ИСТИНА КОНЕЦ");
		
		Колонка = ЗапросПакета.Колонки[ЗапросПакета.Колонки.Количество()-1];
		Колонка.Поля.Установить(ИндексОператора, Выражение);
		Колонка.Псевдоним = "ЕстьПроводки";
		
		Список.ТекстЗапроса = Схема.ПолучитьТекстЗапроса();
		
		Элт = Форма.Элементы.Добавить("ЕстьПроводки", Тип("ПолеФормы"), Форма.Элементы[ИмяРеквизита]);
		Элт.Вид = ВидПоляФормы.ПолеФлажка;
		Элт.Заголовок = "Проводки";
		Элт.ПутьКДанным = ИмяРеквизита + ".ЕстьПроводки";
		Элт.Видимость = Истина;
	КонецЕсли;
КонецПроцедуры

Она добавляет в запрос списка документов соединение с таблицей проводок и колонку ЕстьПроводки. Так же, добавляет в динамический список соответствующую колонку.

Остается вопрос: как вызов этой процедуры добавить во все формы списка бухгалтерских документов. Менять все формы списков и выбора, естественно, не хочется. Просмотрев несколько форм списков, я обнаружил несколько общих процедур, которые вызываются при создании этих форм. Я выбрал процедуру ДополнительныеОтчетыИОбработки.ПриСозданииНаСервере(ЭтаФорма), в самое ее начало добавил 1 строчку — вызов моей вспомогательной процедуры ДопМодуль.ПриСозданииФормыНаСервере(Форма). Вот ее код:

Процедура ПриСозданииФормыНаСервере(Форма) экспорт
	// Добавим галку "Есть проводки" в динамические списки документов
	МДФормы = Метаданные.НайтиПоПолномуИмени(Форма.ИмяФормы);
	МДОбъекта = МДФормы.Родитель();
	Если Метаданные.Документы.Содержит(МДОбъекта) и МДОбъекта.Движения.Содержит(Метаданные.РегистрыБухгалтерии.Хозрасчетный) тогда // Это форма документа
		Если МДФормы = МДОбъекта.ОсновнаяФормаСписка или МДФормы = МДОбъекта.ОсновнаяФормаДляВыбора тогда
			// Это основная форма списка или выбора документа
			Реквизиты = Форма.ПолучитьРеквизиты();
			Для каждого Рекв из Реквизиты цикл
				Если Рекв.ТипЗначения.СодержитТип(Тип("ДинамическийСписок")) тогда
					Список = Форма[Рекв.Имя];
					Если Список.ОсновнаяТаблица = МДОбъекта.ПолноеИмя() тогда
						// Это динамический список с нужными документами
						ДобавитьПризнакПроводокВСписок(Форма, Рекв.Имя);
					КонецЕсли;
				КонецЕсли;
			КонецЦикла;
		КонецЕсли;
	КонецЕсли;
КонецПроцедуры

Она проверяет, подходит ли эта форма под наш случай. Проверяются следующие условия:

  1. Это должна быть основная форма списка или выбора документа (проверяется родитель метаданных);
  2. На форме должен быть реквизит типа ДинамическийСписок;
  3. Основная таблица динамического списка должна быть таблицей данного документа.

В этом случае вызывается наша первая процедура.

Результат — во всех бухгалтерских документах добавлена колонка «Проводки».

P. S. С журналами документов я пока не стал заморачиваться.

has been added to your cart:
Оформление заказа