Так как работа с ДеревомЗначений и ТаблицейЗначений в данном контексте практически не отличается, в примере будет использоваться ДеревоЗначений, все тоже самое за исключением иерархии применимо и к ТаблицеЗначений. Как известно, в платформе 1С 8.1 не составляло никакого труда связать дерево значений с табличным полем на форме, единственное что при этом нужно было не забыть так это СоздатьКолонки(). В управляемом приложении 1С 8.2 сделать это не так просто как кажется на первый взгляд.
Обращаю внимание, что ДеревоЗначений доступно только на сервере, в толстом клиенте и внешнем соединение. В данных самой управляемой формы для моделирования дерева используется тип ДанныеФормыДерево. Для преобразования ДеревоЗначений <-> ДанныеФормыДерево используются методы управляемой формы ЗначениеВРеквизитФормы() и РеквизитФормыВЗначение(). Для непосредственного отображения дерева используется элемент формы типа ТаблицаФормы связанный через реквизит ПутьКДанным с реквизитом формы типа ДанныеФормыДерево. Если Вам не очень понятна вышеописанная связь объектов, не огорчайтесь, ниже рассмотрим практический пример и все встанет на свои места.
Задача: Имеется дерево значений, необходимо отобразить его на управляемой форме.
Создаем новую внешнюю обработку ( Скачивать файлы может только зарегистрированный пользователь! ), добавляем управляемую форму и создаем обработчик ПриСозданииНаСервере(). Никаких реквизитов и элементов “вручную” не добавляем, будем делать это программно.
Механизм Drag and D_rop (или проще говоря “Перетаскивания”) для ДереваЗначений расположенного на управляемой форме управляемого приложения
Основная сложность реализации механизма перетаскивания заключается в том, что у строки ДереваЗначений платформа не позволяет просто изменить родителя, т.е. переподчинить строку. Единственный способ это сделать – создать новую строку вместе со всеми подчиненными строками, т.е. полностью скопировать всю ветку дерева вместе со всей иерархией и подчинить ее требуемой строке-родителю, после чего удалить исходную ветку. Данная задача распадается на две подзадачи:
1). Перед перетаскиванием необходимо проверить корректность данной операции, узел дерева нельзя переносить в узлы подчиненные ему самому, т.е. родительский узел нельзя переносить в дочерние, т.к. это приведет к “бесконечной рекурсии” и “падению” платформы. Это реализуется с помощью обработчика события ЭлементДеревоПроверкаПеретаскивания(…)
2). Если перетаскивание возможно, то при помощи обработчика ЭлементДеревоПеретаскивание(…) запускается рекурсивная функция, которая создает новую ветку дерева, подчиненную требуемому родителю, а исходную удаляет.
Обращаю особое внимание на то, что в платформе 8.2 реализован механизм множественного выбора элементов, поэтому вышеуказанные операции необходимо произвести для всех выбранных пользователем элементов. ( Скачивать файлы может только зарегистрированный пользователь! )
Реализовать трехпозиционный флажок в ДеревеЗначений на управляемой форме
который работает по следующему алгоритму:
* Если у элемента ДереваЗначений нет подчиненных элементов, то флажок может быть либо “включен”, либо “выключен”.
* Если у элемента есть подчиненные, то флажок “включен”, если ВКЛЮЧЕНЫ флажки у ВСЕХ подчиненных элементов, “выключен” если ВЫКЛЮЧЕНЫ флажки у ВСЕХ подчиненных элементов.
Если у некоторых подчиненных элементов флажки включены, а у некоторых выключены, то флажок родительского элемента имеет значение “неопределенно”.
* При включении флажка у родительского элемента, включаются флажки ВСЕХ подчиненных, при выключении флажка у родительского элемента, выключаются флажки ВСЕХ подчиненных.
Возьмем из первой статьи процедуру построения дерева значений и доработаем ее, добавив в дерево еще одну колонку, которая будет содержать элемент управления флажок и реализуем для него обработчик события “ПриИзменении”. Весь алгоритм сводится к обработке изменения флажка: у всех подчиненных элементов необходимо включить/выключить флажки в зависимости от состояния флажка текущего элемента, а у всех родителей текущего элемента (которые расположены на верхних уровнях иерархии) проставить флажки в состояния “включен”/”выключен”/”неопределенно” в соответствии с вышеописанным алгоритмом. ( Скачивать файлы может только зарегистрированный пользователь! )
Вопрос:
Есть ТЗ с типом Значения ДокументСписок.ПоступлениеТоваровУслуг. Мне необходимо добавить еще одну колонку, в котором пользователь сможет отмечать необходимые документы для дальнейшей обработки(флажок, поставил/снял галочку).
8.2 УП Необходимо реализовать трехпозиционный флажок в ДеревеЗначений на управляемой форме 1С предприятия 8.2, который работает по следующему алгоритму:
* Если у элемента ДереваЗначений нет подчиненных элементов, то флажок может быть либо “включен”, либо “выключен”.
* Если у элемента есть подчиненные, то флажок “включен”, если ВКЛЮЧЕНЫ флажки у ВСЕХ подчиненных элементов, “выключен” если ВЫКЛЮЧЕНЫ флажки у ВСЕХ подчиненных элементов.
Если у некоторых подчиненных элементов флажки включены, а у некоторых выключены, то флажок родительского элемента имеет значение “неопределенно”.
* При включении флажка у родительского элемента, включаются флажки ВСЕХ подчиненных, при выключении флажка у родительского элемента, выключаются флажки ВСЕХ подчиненных.
Возьмем из первой статьи процедуру построения дерева значений и доработаем ее, добавив в дерево еще одну колонку, которая будет содержать элемент управления флажок и реализуем для него обработчик события “ПриИзменении”. Весь алгоритм сводится к обработке изменения флажка: у всех подчиненных элементов необходимо включить/выключить флажки в зависимости от состояния флажка текущего элемента, а у всех родителей текущего элемента (которые расположены на верхних уровнях иерархии) проставить флажки в состояния “включен”/”выключен”/”неопределенно” в соответствии с вышеописанным алгоритмом. Пример - Скачивать файлы может только зарегистрированный пользователь!
8.х
На форме имеется табличное поле, источником данных для которого является дерево значений. В одной из колонок расположен элемент управления «Флажок». Необходимо что бы он мог принимать три состояния «Включен», «Выключен» и «Неопределено». При этом состояние «Неопределено» или так называемый «серый флажок», т.е. выбранный частично, устанавливается в том случае, если не у всех подчиненных строк состояние флажка одинаковое. Так же если строка имеет подчиненные строки, то при изменении её флажка, соответствующим образом должны изменяться флажки и всех подчиненных строк.
Во-первых, добавим нашу колонку с флажком в дерево значений:
Во-вторых, при изменении флажка нужно устанавливать соответствующие значения в подчиненных строках и контролировать значение флажка в «строке-родителе»:
Здесь процедура УстановкаФлажков() рекурсивно устанавливает флажки в подчиненных строках:
А функция УстановленноДляВсех() проверяет установлено ли одинаковое значение для всех строк на текущем уровне:
Введение
Многие из Вас, наверное, сталкивались с такой проблемой как, удаление элементов в справочниках, а значит, знают, какую кучу проблем это приносит. Я видал много способов восстановления порушенного справочника. Все их можно свести к следующему:
Заводится новый элемент справочника, аналогичный удаленному элементу, а потом он заносится во все документы, вместо удаленного элемента. Дальше все различается только способом занесения элемента в документы. Кто все исправляет в руки, кто пишет обработку - все зависит от опыта и квалификации исполнителя. После чего, необходимо перепровести все измененные документы. В общем, долгая и нудная работа, не всегда дающая 100% результат правильного восстановления. Есть, правда, один быстрый способ, основанный на формате DBF, точнее методах работы с ним.
Вот об этом мы и поговорим. Итак, что нам для этого надо. Иметь голову, наполненную мозгами, умелые ручки, знания основ перевода чисел из одной системы счисления в другую и любой редактор DBF файлов. Я, к примеру, использую winDBFview фирмы "Гэндальф".
Часть 1. Нам повезло.
С начала, собственно, о формате DBF и методах работы с ним. Думаю, рассказывать обо всем формате нет смысла, это тема отдельной статьи, поэтому расскажем о нем вкратце, для понимания тех действий, которые необходимо совершить.
Итак, что такое DBF формат и с чем его едят. Файл DBF можно разделить на две части: заголовок и, собственно, набор данных. В заголовке находится вся служебная информация, показывающая из каких полей состоит запись, типы этих полей, размер данных в полях, количество записей, размер записи, и откуда в файле начинаются записи, но это сейчас ни к чему. В наборе данных находятся, собственно, записи данных. В начале каждой записи стоит специальный байт - признак удаления. То есть когда вы говорите программе удалить запись, она ее фактический не удаляет, а ставит в первый байт записи метку о том, что данная запись удалена.
Отсюда следует, что если найти запись соответствующую удаленному элементу и сбросить признак удаления, переиндексировать базу, то можно обнаружить что, правильно удаленный
элемент будет восстановлен не только в справочнике, но всех документах.
Для тех, кто не знает что почем, показываю на примере:
Рабочая конфигурация ТиС, удалили элемент справочника товаров.
Запускаем winDBFview и выбираем Файл - Открыть. В появившемся окне диалога находим папку, в которую установлена база и открываем там файл. А какой? Вот ведь вопрос: как узнать? Да просто. Запускаем какую-нибудь оболочку, переходим в папку с базой и находим файл"1Cv7.DD". Открываем его для просмотра и находим там следующую строчку - "Справочник Номенклатура" - в нашем случае, у вас, вместо "Номенклатура" ставим название порушенного справочника (как он называется в конфигураторе) . И видим приблизительно следующее (см. рис. 1). То, что у меня выделено под надписью "Name" и есть искомое нами имя файла. Открываем его в редакторе DBF файлов, и смотрим. В поле CODE содержится код элемента справочника, а в поле DESCR наименование элемента. Как будете искать - уже дело техники и возможностей редактора. Найдя нужный элемент, сбрасываем байт пометки на удаления и сохраняем сделанные изменения.
Часть 2. Нам не повезло.
Но может быть, что вы не смогли быстро приехать к месту событий (всякое в жизни бывает). Приступили к восстановлению элемента. Запустили редактор. И начали искать и не нашли удаленный элемент. Куда он делся? Опять вернемся к формату DBF, и посмотрим, что происходит при добавлении новой записи. С начала программа ищет помеченные на удаление записи и если не находит, то добавляет новую запись. А если находит, вы правы, пишет вместо нее. И что делать, неужто опять все в руки?
Внимательно смотрим листинг файла "1Cv7.DD". Видите перед полем CODE поля ID и PARENTID. Для чего они нужны. Из описания поля (см. рис. 1), следует, что это какой-то идентификатор объекта. Оказывается 1С все равно, на тот код, что вы указали в справочнике элементов. Сама для себя она каждому объекту присваивает свой код. Значит, если мы узнаем этот код, то сможем создать запись полный аналог удаленной. Хм.... А как узнать этот код?
Есть много способов. Я, надеюсь, предлагаю вам самый простой. Итак, начнем.
Запускаем 1С. Лезем в Сервис - Монитор пользователей - Журнал регистрации. В появившемся диалоге делаем отбор: "во всем журнале, отбор по признаку удаление элемента справочника", жмем "ОК".
И смотрим журнал (см. рис. 2). Видите, там, где написано "Номенклатура 2258 04 ....", это и есть удаленный элемент справочника, его нам и надо восстановить. Сверху присутствует
строка: "<Объект не найден>(36201/)", 36201 - это и есть ID объекта. Создаем в справочнике новый элемент - полный аналог удаленному элементу. Выходим из 1С. Запускаем редактор, находим созданный нами элемент и поле ID ставим найденный. Внимательный читатель может сразу заметить существенное различие между соседними записями. Вот сейчас мы и переведем найденный идентификатор к нужному виду.
Перевод из одной системы счисления в другую, подробно изучается в школах и институтах, поэтому на этом останавливаться не будем. Изучив весь справочник, замечаем, что в идентификатор состоит из цифр и заглавных букв латинского алфавита. То есть может содержать все цифры от "0" до "9", и буквы от "A" до "Z". Значит, используется тридцати шестеричная система счисления 10 цифр плюс 26 букв. Приступим:
* 36201 делим на 36, получаем 1005 в остатке 21;
* 1005 делим на 36, получаем 27 в остатке 33;
В конце имеем три числа: 27, 33, 21. Заменяем их соответствующими значениями из приведенной ниже таблицы и получаем ID объекта RXL. Записываем его вместо ID созданного нами элемента. Номер можно получить средствами самой 1С использую функцию _IdToStr() и наоборот получит десятичное число из его тридцати шестеричного представления _StrToId().
Запускаем 1С, индексируем базу и смотрим, что имеем (см. рис. 3)
Что и требовалось получить. Пользуйтесь.
В форме документа на основной панели "ДействияФормы" создаем подменю "ПодменюТипДокумента" и в процедуру при открытии добавляем СформироватьТипыДокумента():
В результате на форме появляется подменю Тип Документа, с выбором значений Обычный, Валюта, Рубли! При выборе значения на нем устанавливается помета,а на других убирается и устанавливается значение реквизита ВидРасчета
Следующий пример показывает как выгрузить из табличной части Подразделения, удалить повторяющиеся и в "КоманднаяПанельЗарплата" - меню "ФормированиеВедомостей" - подменю "СформироватьПоПодразделению" добавить для каждого подразделения кнопку формирования ведомости