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