Другой юноша нес свое:
"Я нашел, как применить здесь нестирающие шины из полиструктурного волокна
с вырожденными аминными связями и неполными кислородными группами.
Но я не знаю пока, как здесь использовать регенерирующий реактор
на субтепловых нейтронах. Миша, Мишок! Как быть с реактором?"
Присмотревшись к устройству, я без труда узнал ВЕЛОСИПЕД.
А.Стругацкий, Б.Стругацкий, "Понедельник начинается в субботу"
Описание проблемы:
Задача групповой обработки документов разного рода (в том числе перепроведения) также стара, как сама 1С.
И следовательно, не нуждается в особом описании.
Из-за популярности проблемы имеется масса работ посвященной этой тематике.
По видимому каждый программист 1С старается внести свой вклад в это дело.
Поэтому, я решил не отбиваться от коллектива и представляю на суд общественности свою скромную разработку.
Первоначальная идея и базовый функционал предлагаемой обработки принадлежит Павлушиной Александре. Я добавил универсальные подборы выборки документов, рекурсивную обработку подчиненных документов, выборочное проведение по видам движений (в описанном виде) и контекстное меню действий с документом при клике мышью.
Описание файлов поставки:
1) ОбработкаВыборкиДокументов.rar - сама обработка выборки документов;
2) PlugIns.rar - архив содержит сервисные обработки , без которых работа обработки либо невозможна, либо более удобные, чем соответствующие штатные средства платформы:
- ПодборUChoice.ert, Консоль1CQA.ert - используются для подбора выборки документов (одна из них обязательно должна быть доступна!);
- ВыборИзСпискаЗначений_sys.ert - используется для отметки значений в списках фильтров по видам движений и видам подчиненных документов (Рис.4);
3) FormEx1CPP.rar - содержит класс КОП 'Общие.Форма.Привязка' и файлы ВК 1CPP.dll, FormEx.dll;
4) _isВидДвиженияЗапись().txt - содержит пример кода функции, возвращающей значение флага записи по выбранному виду движения документа;
5) _глПроведениеОчисткаВидовДвижений().txt - содержит пример кода процедуры для очистки движений документа при его выборочном проведении;
6) _ОбработкаПроведения().txt - содержит пример кода с заготовкой процедуры проведения документа,
реализующей технологию выборочного проведения документа, описываемую в данной работе;
Требования:
1) Желательно наличие внешних компонент:
а) Внешняя компонента 1CPP.dll (http://www.1cpp.ru/index.php/Download).
- В некоторых алгоритмах обработки по возможности используется объект 'Индексированная таблица'.
Если такой объект не может быть создан - используются "запасные" варианты алгоритмов через 'ТаблицуЗначений';
- Для получения выборки подчиненных документов по возможности используются прямые запросы 1C++.
Если прямые запросы не доступны - используются средства, предоставляемые объектом 'Документ';
- Для инициализации дополнительных параметров проведения документов используется объект "ВыполняемыйМодуль".
Без этого объекта указанная возможность не доступна;
б) Внешняя компонента FormEx.dll, или ее ядро в составе 1CPP.dll (http://www.dorex.pro/?download).
- Версия компоненты FormEx.dll или ее ядра должны поставлять объект 'Сервис' (используется для выборов из меню).
Если объект 'Сервис' создать не удается - используются "запасной" вариант выбора из меню через 'СписокЗначений'.
Если обработка используется как внешняя, специально загружать ВК не требуется. Достаточно разместить файлы библиотек
в одном каталоге с обработкой. При необходимости обработка сама загрузит ВК при открытии формы.
2) Для красоты в интерфейсе обработки также желательно иметь в конфигурации КОП 'Общие.Форма.Привязка' -
класс определенный пользователем, управляющий привязками в диалоге формы обработки (Автор: Дмитрий Ощепков mailto:dmitro-75@mail.ru).
Если экземпляр класса не удается создать, в форме обработки не работают привязки элементов диалога.
3) Желательно наличие обработки 'ВыборИзСпискаЗначений_sys' для отметки значений в списках фильтра по "Видам движений документов" и фильтра по "Видам подчиненых документов" (Рис.6). Без этой обработки отметка значений осуществляется с помощью средств объекта "СписокЗначений" (Рис.5).
4) Обязательно должна быть доступна одна из обработок подбора объектов:
- "ПодборUChoice" (//infostart.ru/public/97811/ );
- "Консоль1CQA" ( //infostart.ru/public/98982/ );
Без них в обработке не будет возможности заполнить список документов для обработки.
5) Желательно наличие следующих сервисных обработок, используемых при обработке выбора в меню действий с документом при клике мыши по ячейке в таблице выборки документов или в отчете об ошибках обработки:
- "ИзменениеВремениДокумента" - используется для изменения дата-времени документа;
- 'Редактор Реквизитов' (автор Цылёв Владислав vet7777@mail.ru) - используется для альтернативного редактирования документа;
Установка:
1) Добавить в конфигурацию или скопировать в удобный для работы каталог обработку из архива ОбработкаВыборкиДокументов.rar.
2) Добавить в конфигурацию или скопировать в тот же каталог сервисные обработки из архива PlugIns.rar (при их отсутствии).
3) Рекомендуется добавить в конфигурацию или скопировать в тот же каталог прочие сервисные обработки (при их отсутствии).
4) Рекомендуется обеспечить загрузку ВК 1CPP.dll, FormEx.dll тем или иным способом. А также подключить класс КОП 'Общие.Форма.Привязка'.
Возможности:
1) Обработка позволяет выполнить над выборкой документов ряд действий (выбирается из списка 'Вид обработки'):
- "Провести";
- "Отменить проведение";
- "Пометить на удаление";
- "Снять пометку на удаление";
- "Удалить непосредственно";
- "Сменить фирму" (доступно если в конфигурации есть справочник 'Фирмы' и общий реквизит документа 'Фирма');
При ошибках обработки документов по ее завершении также выводится отчет об ошибках (Рис.8). В разных колонках отчета выводится ссылка на документ и информация об ошибке.
При клике мышью по документу, выводится контекстное меню, позволяющее выполнит над документом различные действия, смотри ниже п.5 (Рис.3 и Рис.8).
2) Выборка документов может быть подобрана в обработках со следующими именами:
- "ПодборUChoice" (Рис.1);
- "Консоль1CQA" (Рис.2);
обработки либо должны быть включены в состав конфигурации, либо должны лежать в одном каталоге с данной обработкой (если эта обработка используется как внешняя).
3) Выборка документов может быть сохранена в файл и загружена из файла (используются функции ЗначениеВФайл(,,) и ЗначениеИзФайла(,,)).
4) При загрузке выборки документов из подбора доступны следующие возможности:
- Принудительная сортировка выборки документов по хронологии (флаг 'сортировать по хронологии');
- Отмена добавления документа в список, если он там уже имеется (флаг 'пропускать, уже добавленные');
- Отмена добавления документа в список, если у него есть подчиненные (флаг 'пропускать, имеющие подчиненные');
- Прямая загрузка выборки документов в таблицу значений диалога, вместо построчного добавления (флаг 'прямая загрузка выборки'),
данный режим может оказаться предпочтительной в случае больших выборок документов; - Добавление отобранной выборки документов в подборе к уже имеющемуся списку документов без изменения структуры колонок (Рис.9). При заполнении дополнительных колонок в новых строках списка документов последовательно делаются попытки
чтения значений из выборки документов и из атрибута добавляемого объекта по имени колонки.
5) При двойном клике мышью по ячейке таблицы выборки документов, выводится контекстное меню,позволяющее выполнить со значением в ячейке следующие действия:
- открыть объект в списке или диалоге;
- сформировать отчет о движениях документа;
- сформировать структуру подчиненности документа;
- измененить временя-дату документа (требуется обработка "ИзменениеВремениДокумента");
- открыть объект для редактирования в обработке 'Редактор Реквизитов' (автор Цылёв Владислав vet7777@mail.ru);
6) Общие опции обработки выборки документов:
- Обработка всей выборки документов в одной транзакции (флаг 'в единой транзакции');
- Обработка только тех документов, которые ранее были обработаны с ошибкам (флаг 'только с ошибками');
- Задержка между обработкой документов в миллисекундах (не нулевое значение в поле выбора 'Задержка между обработкой');
- Обработка документов вместе с подчиненными (флаг 'вместе с подчиненными док-тами следующих видов:')
при этом возможна рекурсивная обработка подчиненных документов (включая подчиненные подчиненных), а также установка фильтра по видам подчиненных документов (Рис.5);
7) Особенности обработки документов при проведении:
- Помеченные на удаление - пропускаются всегда;
- Не проведенные - пропускаются, если установлен флаг 'при проведении пропускать не проведенные документы'
Если флаг не установлен - документы проводятся. По умолчанию флаг устанавливается при открытии обработки;
- Документы проводятся с передачей в модуль документа параметра проведения, зависящего от значения,
выбранного в списке "Тип параметра" (Рис.10):
а. "Неопределено":
В качестве параметра проведения используется пустое значение неопределенного типа. Фильтр по видам движений игнорируется.
б. "Строка 'ВидыДвижений'":
В качестве параметра проведения используется строка фильтра по видам движений 'ВидыДвижений'.
в. "СписокЗначений {'ВидыДвижений'}" и "СписокЗначений {'ВидыДвижений'; 'ОсобыеПрава'}":
В качестве параметра проведения используется список значений следующего вида
сзПараметрыПроведения=СоздатьОбъект("СписокЗначений"); сзПараметрыПроведения.Установить("ВидыДвижений",ВидыДвижений);
сзПараметрыПроведения.Установить("$ОсобыеПраваПрограмногоПроведения$",1); // - для последнего варианта с особыми правами
...
рез=ДокуменОбъект.Провести(,сзПараметрыПроведения);
В качестве строки фильтра по видам движений 'ВидыДвижений' используется значение поля ввода "Выборочно проводить по видам движений" (Рис.4),
которая составляется строка из идентификаторов видов движений документов, отмеченных в списке фильтра, разделенных точкой с запятой.
Строки идентификаторов видов движений соответствуют описанию встроенной процедуры ОчиститьДвижения();
Параметр "$ОсобыеПраваПрограмногоПроведения$" может быть использован в модуле проведения, для обхода контроля некоторых ограничений, например, даты запрета редактирования или особых прав на проведение документа.
Параметр проведения документов можно произвольно переопределять с помощью текста модуля инициализации параметров проведения. Например, можно установить в списке значения с другими именами или перезаписать строковым значением: сзПараметры="Операция"; Использование модуля инициализации доступно при наличии ВК 1cpp.dll (используется объект "ВыполняемыйМодуль"). С помощью кнопки "add module string" (Рис.11) можно вставить выбором из меню заготовку для строки кода модуля инициализации. С помощью кнопки "test module" (Рис.6) можно проверить правильность модуля инициализации параметров проведения, а также просмотреть значение переменной с параметром проведения документов. Для просмотра списка в форме показанной на Рис.6 необходимо наличие в конфигурации подсистемы ViewValues (просмотр "табличных" объектов).
8) Для обеспечения выборочного проведения документа по видам движений в модулях документов
должна быть реализована корректная обработка параметра "ВидыДвижений", передаваемого в списке значений через аргумент процедуры ОбработкаПроведения(<Знач>).
Примерная схема реализации выборочного проведения следующая:
а) У интересуемых документов снимается флаг автоматического удаления движений при проведении;
б) В глобальном модуле добавляются экспортные процедуры и функции (смотри примеры ниже):
- isВидДвиженияЗапись(ИдВидДвиженияИд,ВидыДвижений)
возвращает флаг записи по выбранному виду движения ИдВидДвиженияИд (Пример кода 1);
- глПроведениеОчисткаВидовДвижений(Конт,ВидыДвижений)
выполняет очистку видов движений с учетом значений флагов записи (Пример кода 2);
в) В процедуре ОбработкаПроведения(<Знач>) в самом начале из параметра вычисляется список видов движений ВидыДвижений.
Этот список лутше хранить в переменной модуля. Затем програмно очищаются нужные виды движений вызовом
процедуры глПроведениеОчисткаВидовДвижений(Контекст,ВидыДвижений) (Пример кода 3);
г) Далее во всех алгоритмах проведения запись движений должна осуществляться только тогда, когда значение флага
записи по выбранному виду движения, возвращаемый функцией isВидДвиженияЗапись(ИдВидДвиженияИд, ВидыДвижений), больше нуля.
При реализации выборочного проведения документов следует учесть следующее:
а) В предлагаемой схеме, если не указан список видов движений, то выполняется запись по всем видам движений.
Но прикладная логика конфигурации может быть иной.
Например, в "Комплексной конфигурации-7.7" движения по бухгалтерским проводкам зависят от настроек базы:
- Они могут быть созданы сразу (вместе с движениями по регистрам оперативного учета);
- А могут формироваться отдельно регламентной обработкой в конце месяца;
б) Некоторые виды движений могут быть взаимосвязанными. Например себестоимость в регистре продаж зависит от стоимости, списанной по партиям товаров.
Использование:
Администрирование данных - групповая обработка документов, подобранных произвольным образом (в зависимости от стоящей задачи).
Благодарности:
Выражаю огромную благодарность Павлушиной Александре за полезные советы, дружескую помощь и живое человеческое общение за время совместной работы!