Связанные документы 1с как сделать
Вступайте в мою группу помощник программиста.
В ней мы обсуждаем программирование в 1С.
Документы
Описание:
Документ – одно из основных понятий системы 1С:Предприятие. При помощи документов организуется ввод в систему информации о совершаемых хозяйственных операциях, а также ее просмотр и корректировка.
В большинстве своем документы, которые создаются в процессе настройки конфигурации задачи, являются электронными аналогами стандартных бумажных документов, являющихся основаниями для тех или иных учетных действий или расчетов. Тем не менее, использование этого типа данных может выходить далеко за рамки простой фиксации изменений, внесенных в учетные регистры.
Структура каждого конкретного вида документа определяется при его создании в конфигураторе. У любого вида документа существуют реквизиты, которые создаются автоматически – это "Дата" и "Номер". Номер создается, если при конфигурировании длина номера указана больше 0. Другие реквизиты документа определяются в конфигураторе отдельно для каждого создаваемого вида документа.
Документы в языке 1С 8.3, 8.2 (в примерах)
С уважением, Владимир Милькин (преподаватель школы 1С программистов и разработчик обновлятора).
Подписывайтесь и получайте новые статьи и обработки на почту (не чаще 1 раза в неделю). |
Вступайте в мою группу ВКонтакте, Одноклассниках, Facebook или Google+ — самые последние обработки, исправления ошибок в 1С, всё выкладываю там в первую очередь.
Как помочь сайту: расскажите (кнопки поделиться ниже) о нём своим друзьям и коллегам. Сделайте это один раз и вы внесете существенный вклад в развитие сайта. На сайте нет рекламы, но чем больше людей им пользуются, тем больше сил у меня для его поддержки.
Нажмите одну из кнопок, чтобы поделиться:
Структуру подчиненности документа можно увидеть, запустив из документа общую форму "ФормаСтруктурыПодчиненности". Но как получить связанные документы для обработки данных? Я взял процедуры из модуля этой формы, немного поколдовал, и превратил их в пару функций, возвращающих список документов из структуры подчиненности нужного документа. Нужно отметить, что иерархии подчиненности в результатах работы функций нет, в отличие от процедур, работающих с деревом значений в форме. Вот хочу поделиться результатом со всеми, так как мне самому бывает приятно заполучить иногда кусочек готового кода, который впоследствие можно использовать для решения своих задач.
Основной параметр функций "ДокументСсылка" – обязательный. Это ссылка на документ, для которого будем получать родительские (подчиненные) документы.
Также может быть полезен в работе параметр "СписокСвязанныхДокументов". Он не является обязательным, и используется для хранения списка документов из структуры подчиненности. Его можно задать, если, например, нужен общий список и родительских, и подчиненных документов.
Примеры:
1. Получение общего списка родительских документов двух и более документов.
2. Получение общего списка и родительских, и подчиненных документов.
Дополнение:
Функция ПолучитьВыборкуПоКритериюОтбора(ИмяКритерияОтбора, ЗначениеКритерия) Экспорт
Запрос = Новый Запрос;
ТекстЗапроса = "";
Для Каждого ЭлементСостава ИЗ Метаданные.КритерииОтбора[ИмяКритерияОтбора].Состав Цикл
Если Не ЭлементСостава.Тип.СодержитТип(ТипЗнч(ЗначениеКритерия)) Тогда
Продолжить;
КонецЕсли;
ПутьКДанным = ЭлементСостава.ПолноеИмя();
СтруктураПутьКДанным = ОбщегоНазначения.РазобратьПутьКОбъектуМетаданных(ПутьКДанным, ЭлементСостава.Родитель());
ЕСли НЕ ПравоДоступа("Чтение", СтруктураПутьКДанным.Метаданные) Тогда
Продолжить;
КонецЕсли;
ИмяОбъекта = СтруктураПутьКДанным.ТипОбъекта + "." + СтруктураПутьКДанным.ВидОбъекта;
ПсевдонимТаблицы = СтруктураПутьКДанным.ТипОбъекта + "_" + СтруктураПутьКДанным.ВидОбъекта + "_" + СтруктураПутьКДанным.ИмяТаблЧасти;
ТекущаяСтрокаГДЕ = "ГДЕ " + ПсевдонимТаблицы + "." +СтруктураПутьКДанным.ИмяРеквизита + " = &ЗначениеКритерияОтбора";
ИмяТЧ = Лев(СтруктураПутьКДанным.ИмяРеквизита, Найти(СтруктураПутьКДанным.ИмяРеквизита, ".")-1);
ИмяРеквизита = Лев(СтруктураПутьКДанным.ИмяРеквизита, Найти(СтруктураПутьКДанным.ИмяРеквизита, ".")-1);
ТекстЗапроса = ТекстЗапроса + (?(ТекстЗапроса = "", "ВЫБРАТЬ", "ОБЪЕДИНИТЬ ВСЕ
|ВЫБРАТЬ") + "
|" + ПсевдонимТаблицы + ".Ссылка ИЗ " + ИмяОбъекта + "." + СтруктураПутьКДанным.ИмяТаблЧасти + " КАК " + ПсевдонимТаблицы + "
|" + СтрЗаменить(ТекущаяСтрокаГДЕ, "..", ".") + "
|");
Если ТекстЗапроса = "" Тогда
Возврат Новый ТаблицаЗначений;
КонецЕсли;
Запрос.Текст = ТекстЗапроса;
Запрос.УстановитьПараметр("ЗначениеКритерияОтбора", ЗначениеКритерия);
Возврат Запрос.Выполнить().Выгрузить();
Функция РазобратьПутьКОбъектуМетаданных(ПутьКДанным, МетаданныеОбъекта = Неопределено) Экспорт
Структура = Новый Структура;
СоответствиеИмен = Новый Массив();
СоответствиеИмен.Добавить("ТипОбъекта");
СоответствиеИмен.Добавить("ВидОбъекта");
СоответствиеИмен.Добавить("ПутьКДанным");
СоответствиеИмен.Добавить("ИмяТаблЧасти");
СоответствиеИмен.Добавить("ИмяРеквизита");
Для индекс = 1 по 3 Цикл
Точка = Найти(ПутьКДанным, ".");
ТекущееЗначение = Лев(ПутьКДанным, Точка-1);
Структура.Вставить(СоответствиеИмен[индекс-1], ТекущееЗначение);
ПутьКДанным = Сред(ПутьКДанным, Точка+1);
ПутьКДанным = СтрЗаменить(ПутьКДанным, "Реквизит.", "");
Если Структура.ПутьКДанным = "ТабличнаяЧасть" Тогда
Для индекс = 4 по 5 Цикл
Точка = Найти(ПутьКДанным, ".");
Если Точка = 0 Тогда
ТекущееЗначение = ПутьКДанным;
Иначе
ТекущееЗначение = Лев(ПутьКДанным, Точка-1);
КонецЕсли;
Структура.Вставить(СоответствиеИмен[индекс-1], ТекущееЗначение);
ПутьКДанным = Сред(ПутьКДанным, Точка+1);
Структура.Вставить(СоответствиеИмен[3], "");
Структура.Вставить(СоответствиеИмен[4], ПутьКДанным);
Если МетаданныеОбъекта <> Неопределено Тогда
Структура.Вставить("Метаданные", МетаданныеОбъекта);
Иначе
Если Структура.ТипОбъекта = "Документ" Тогда
Структура.Вставить("Метаданные", Метаданные.Документы[Структура.ВидОбъекта]);
Иначе
Структура.Вставить("Метаданные", Метаданные.Справочники[Структура.ВидОбъекта]);
КонецЕсли;
КонецЕсли;
Задача
Из-за частых ошибок ввода данных в базу была поставлена задача создания запрета отмены проведения документов, если на их основании введен хотя бы один проведенный документ.
В тестовой конфигурации имеются три документа: "Заявка", "Расходный ордер" и "Приходный ордер". Связь между документами следующая:
В соответствии с этой связью и нужно выполнить задание.
Способы реализации
Есть несколько путей решения. Например, мы можем в подписке на событие перед записью документа выполнять запрос на выборку документов, введенных на основании. Разумеется, для каждого документа нужно будет составлять свой запрос. Например, для документа "ПриходныйОрдер" из тестовой базы программный код проверки наличия связанных документов с проведенным статусом приведен в следующем листинге:
Вариант рабочий, но тогда нам придется для каждого документа писать свой запрос. Даже если мы будем формировать текст запроса автоматически с учетом структуры метаданных и типов реквизитов документа, то мы не сможем обработать все возможные ситуации. Хотя бы потому, что мы не знаем точную связь между документами, а также по каким реквизитам она устанавливается.
Еще один вариант – использование критериев отбора. В одной из предыдущих статей "Критерии отбора на простом примере" был продемонстрирован простой пример работы с этим объектом конфигурации. Аналогично мы можем изменить программный код обработки проверки зависимых документов и получим более универсальное решение.
В настройке критерия отметим лишь настройку его состава:
Вариант будет работать, причем его реализация относительно универсальная. Проверка будет опираться на настройку состава используемого критерия отбора.
Заключение
Из рассмотренных двух вариантом наиболее оптимальным является второй – использование критерия отбора. С позиции разработчика реализация не займет много времени, а дальнейшая доработка будет простой. Однако при решении задач, где производительность – критический фактор, нужно описывать все необходимые действия проверки "вручную", а также возможно использовать дополнительные таблицы. Но эти способы выходят за рамки статьи.
При использовании расширений можно столкнуться с ошибкой, что в структуре подчиненности тех объектов, которые добавлены в расширение, перестанут отображаться родительские документы-основания. Например, для реализации не будет отображаться заказ клиента, но будет отображаться счет-фактура. Если отключить расширение, то заказ клиента тоже появится в связанных документах.
Данное расширение исправляет данную ошибку.
Внимание: данная ошибка проявляется только если у Вас уже есть подключенные расширения!
Установка:
Раздел "НСИ и Администрирование ->Печатные формы, отчеты и обработки ->Расширения" Команда "Добавить из файла". Выберите файл расширения. Затем перезапустите программу.
Расширение тестировалось на релизе Управление торговлей, редакция 11 (11.4.6.174). С большой вероятностью подойдет для более новых релизов, а также для других конфигураций, так как связанные документы - это объект из библиотеки стандартных подсистем. Даже если не подойдет, то код полностью открыт, все мои доработки выделены комментариями. Даже начинающий программист сможет переделать для своей версии.
Архив документов, причем независимо от того, актуальные они или архивные, которые были сформированы за все время деятельности предприятия, должен содержать в себе не только сами документы, но и данные о том, как они связаны между собой. Любой ответ должен быть связан как-то с входящим письмом, допсоглашение привязывается к договору или переписке, действие регламента привязывается к приказу и тому подобное.
Для того, чтобы оптимально настроить функционал этого блока, вам нужно знать о том, как классифицируются связи в системе. Сама система делит все связи на два вида, в зависимости от того, как они появляются в системе:
- автоматический – это вид, который создается самой системой. Например, привязывает ответ к входящему письму;
- ручной – этот вид создается самим пользователем в карточке документа. При таком способе добавления система фиксирует того, кто добавил связь, а также время добавления связи.
Есть еще понятия, которые нужно знать:
Все виды связей, которые мы обозначили есть в 1С: Документооборот и используются во время настройки системы.
В этой же форме мы можем установить обязательность типа связи. Тогда, если вы создадите документ с данным видом, то он потребует создание связи в автоматическом режиме.
Использование связей позволит вам отследить и систематизировать любые взаимосвязи между необходимыми документами, контролироваться создание новых документов и выстраивать документальные цепочки.
Вступайте в мою группу помощник программиста.
В ней мы обсуждаем программирование в 1С.
Документы
Описание:
Документ - одно из основных понятий системы 1С:Предприятие. При помощи документов организуется ввод в систему информации о совершаемых хозяйственных операциях, а также ее просмотр и корректировка.
В большинстве своем документы, которые создаются в процессе настройки конфигурации задачи, являются электронными аналогами стандартных бумажных документов, являющихся основаниями для тех или иных учетных действий или расчетов. Тем не менее, использование этого типа данных может выходить далеко за рамки простой фиксации изменений, внесенных в учетные регистры.
Структура каждого конкретного вида документа определяется при его создании в конфигураторе. У любого вида документа существуют реквизиты, которые создаются автоматически - это "Дата" и "Номер". Номер создается, если при конфигурировании длина номера указана больше 0. Другие реквизиты документа определяются в конфигураторе отдельно для каждого создаваемого вида документа.
Документы в языке 1С 8.3, 8.2 (в примерах)
С уважением, Владимир Милькин (преподаватель школы 1С программистов и разработчик обновлятора).
Как помочь сайту: расскажите (кнопки поделиться ниже) о нём своим друзьям и коллегам. Сделайте это один раз и вы внесете существенный вклад в развитие сайта. На сайте нет рекламы, но чем больше людей им пользуются, тем больше сил у меня для его поддержки.
Читайте также: