gifts2017

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

Опубликовал Александр Кузин (sashocq) в раздел Программирование - Практика программирования

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

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

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

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

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

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

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

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

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

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

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

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

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Игорь Фелькер (Brawler) 01.04.15 22:48
Идея и реализация конечно хороши, но стоит ли так делать?
Можно же было бы сделать отчет, который пробежит по всей базе и найдет все "корявые" документы.
alest; Dvornik; soulsteps; makas; TrinitronOTV; t278; +6 Ответить 2
2. John Bolshakov (soulsteps) 02.04.15 11:03
(1) Brawler, полностью согласен, хорошо, когда база для "себя", а если объем доков внушительный и количество пользователей тоже...кому нужна лишняя неоправданная нагрузка на сервер...а вот отчет...или, например, регламентная проверка в "ночные часы" с отправкой результата на почту...- нормуль))
3. Александр Кузин (sashocq) 02.04.15 13:43
(1), (2), Бухгалтерам понравилась именно простота доступа к этой информации.
По поводу нагрузки - согласен. В той базе, где это внедрено, нагрузка не критичная. А чтобы вообще лишний раз не было этой нагрузки можно сделать это соединение {опциональным} и колонку скрытой по умолчанию. Будет время — сделаю и обновлю публикацию.
4. Юрий Муллабакиев (mulla1979) 02.04.15 18:59
Отличное решение! Столкнулся на внедрении с такой же проблемой, теперь бухам их хоть наглядно будет видно :-)
5. Александр Кузин (sashocq) 03.04.15 13:46
Кстати, если кто-нибудь наткнется таки на отладочную запись в ЖР "Не могу добавить признак проводок", сообщите, пожалуйста, конфигурацию, номер релиза и вид документа. Просто я с таким не сталкивался.
6. Анна Смирнова (Порт) 08.04.15 16:37
Наглядность- дело хорошее! Вот только бух сам это не пропишет)) такая вещь хороша в виде обработки внешней, чтобы запускать и проверять по мере надобности.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа