gifts2017

Использование готовых инструментов

Опубликовал Александр Крынецкий (echo77) в раздел Управление - Пользователю системы

В статье перечислены довольно простые задачи, с которыми сталкивался каждый программист 1С во время своей работы, и указаны наиболее эффективные (по мнению автора) инструменты для их решения

Введение

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

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

Перечень задач

  1. Удаление помеченных объектов немонопольно, по типам объектов
  2. Перенумерация справочников, документов
  3. Групповое изменение реквизитов объектов, реквизитов подчиненных объектов
  4. Частичный и полный перенос данных между однотипными конфигурациями (миграция, подготовка урезанной базы, восстановлении данных из резервных копий)
  5. Разовая загрузка данных из других источников (.dbf, .xls, .txt)
  6. Определить, какие данные записываются в базу данных при выполнении определенных действий

Удаление помеченных объектов

   Как известно, в процессе эксплуатации базы данных все мы делаем ошибки, поэтому ненужные элементы помечаются на удаление. Для их удаления из базы данных необходимо выполнить процедуру удаления помеченных объектов. Процедура вызываемая из главного меню (обычное приложение) Операции->Удаление помеченных объектов требует монопольного доступа к базе данных, к тому же если регламентное обслуживание базы данных находится в запущенном состоянии количество помеченных объектов может быть достаточно большим и процедура контроля всех помеченных объектов может занять кучу времени или даже вызвать ошибку в процессе выполнения.

Для решения данной задачи существует замечательная обработка с диска ИТС УдалениеПомеченныхОбъектов.epf, которая позволяет осуществлять все операции в немонопольном режиме, выборочно по объектам. Так же в ней можно установить отбор по объектам метаданных и снять/установить флажки.

Обработка Удаление помеченных объектов

Рис.1. Обработка Удаление помеченных объектов

Важно! Еще одной хитростью данной обработки является возможность найти помеченный объект по ссылке и выбрать только его. О чем речь? Например, вы пометили на удаление номенклатуру, вместе с ней пометились подчиненные ей единицы измерения "шт". Открыв эту обработку вы, возможно увидите, что существует множество единиц измерения с наименованием "шт", помеченных на удаление, какой же элемент именно ваш? Вам поможет поиск по значению. Для этого:

  1. Встаем в колонку Ссылка и жмем Ctrl+F(поиск)
  2. В открывшемся окне поиска устанавливаем переключатель в положение "Поиск по значению"
  3. Выбираем тип значения(например, справочник Единицы измерения)
  4. Далее можно просто скопировать-вставить в поле ввода код искомой единицы измерения или найти ее в справочнике каким-либо другим способом
  5. Жмем кнопку Искать. Если все верно, система достаточно быстро отметит в списке найденную ссылку
Поиск в списке ссылок
Рис.2. Поиск произвольной ссылки среди помеченных на удаление

Развитие данной обработки: Удаление помеченных объектов за период

Перенумерация справочников, документов

   В работе с "боевой" базой данных мне приходилось всего лишь один раз выполнять перенумерацию части справочника номенклатура и для этого была написана отдельная обработка одной кнопки. Документы приходилось перенумеровывать чаще: при чем суть перенумерации была не в изменении номера документа как такового, а в изменении количества лидирующих нулей в номере, т.е. я приводил номера вида 00000001234 к виду 01234. Операция безболезненная в типовых, т.к. на печать идут только значащие цифры.

   Данную операцию перенумерации я делал с помощью достаточно универсальной обработки с того же диска ИТС УниверсальныеПодборИОбработкаОбъектов.epf. Данная обработка позволяет изменять документы и справочники. К сожалению Планы видов характеристик, планы видов расчета и планы счетов она изменять не может.

Итак, как же привести номера документов вида 00000001234 к виду 01234. Все просто:

  1. Открываем обработку УниверсальныеПодборИОбработкаОбъектов.epf
  2. В поле объект поиска выбираем интересующий нас вид документа
  3. На вкладке отбор по значениям реквизитов указываем по каким критериям необходимо отобрать документы. В моем случае, я указывал все документы с начала года, т.е. Дата >= 01.01.2013 (рис.2)
  4. Жмем кнопку Найти объекты. Выполняется переход к вкладке Найденные объекты 
  5. На вкладке Найденные объекты можно просмотреть какие объекты для обработки были отобраны и установить/снять флажки с тех объектов, которые обрабатывать не нужно. Очень удобно (рис.3)
  6. Переходим на вкладку Обработки. В дереве Обработка/Настройка добавляем новый элемент в разделе Произвольный алгоритм и пишем код 
    НоваяДлинаНомера = 7; // Это параметр, он может быть разный :-)
    СтарыйНомер = Объект.Номер;
    
    СтарыйНомер = СокрЛП(СтарыйНомер);
    НовыйНомер = Прав(СтарыйНомер, НоваяДлинаНомера);
    
    Если СтарыйНомер <> НовыйНомер Тогда
    	Объект.Номер = НовыйНомер;
    	Сообщить(Объект);
    
    	Объект.Записать(РежимЗаписиДокумента.Запись);
    	
    КонецЕсли;
  7. Жмем кнопку Выполнить
Картинки

Рис.3. Универсальный подбор и обработка объектов. Отбор

Рис.4. Универсальный подбор и обработка объектов. Просмотр отобранных объектов

Рис.5. Универсальный подбор и обработка объектов. Обработка отобранных объектов

В результате выполнения будут изменены номера документов, при этом документы будут переписаны БЕЗ перепроведения. Это очень неплохо, т.к. не будет затрачено время на проведение документов, движения документов не изменятся. Но, надо учитывать тот факт, что например, при записи документа ТабельУчетаРабочегоВремени удаляются записи в регистре ГрафикиРаботыПоВидамВремени 

Групповое изменение реквизитов объектов

  Это достаточно частая задача и она имеет множество вариаций. Например, необходимо пометить на удаление(или переместить) все элементы номенклатуры в определенной группе, с видом номенклатуры Материалы. Для решения данной задачи достаточно воспользоваться обработкой, которая есть во всех типовых конфигурациях - это ГрупповаяОбработкаСправочниковИДокументов (в полном интерфейсе, в главном меню Сервис ->Групповая обработка справочников и документов). Как видно из названия - эта штука умеет обрабатывать только справочники и документы, при чем обрабатываются только элементы справочников, группы(реквизит ЭтоГруппа=Истина) не обрабатываются. Кроме самих элементов справочников или документов можно так же обработать их табличные части. Как это сделать:

  1. Открываем обработку
  2. Выбираем тип объекта Справочники или Документы, если необходимо обработать табличные части ставим галку Обрабатывать табличные части(рис. 5)
  3. Добавляем виды обрабатываемых объектов в табличную часть
  4. После этого устанавливаем отбор, чтобы выбрать только интересующие объекты для обработки
  5. Жмем кнопку Отобрать. Будут отобраны объекты, выполнен переход на вкладку Обработка. Если необходимо выполнить отбор по свойствам/категориям объектов - жмем кнопку Настройка на верхней панели, ставим соответствующую галку
  6. На вкладке Обработка можно просмотреть все что отобрано и проставить отметки на тех элементах, которые нужно обработать.
  7. Выбираем действие из перечня (изменить Дата, Проведение документа, Пометка на удаление, Группа, Изменить свойство..., Изменить Категорию..., Изменить реквизит)
  8. Жмем кнопку Выполнить
Картинки
Рис 6. Групповая обработка справочников и документов. Объекты отбора
 
 
Рис. 7.  Групповая обработка справочников и документов. Выполнить действие
 
   Так же хочу отметить вот эту публикацию ГОСиД - Универсал - это та же групповая обработка справочников и документов, но доработанная и её можно использовать в любой конфигурации.  
   Но иногда задача стоит более изощренно: например, необходимо создать единицу измерения для элементов справочника номенклатура после некорректной загрузки. Здесь уже групповая обработка справочников и документов бессильна, нам  поможет УниверсальныеПодборИОбработкаОбъектов. Последовательность будет такая:
  1. Открываем обработку УниверсальныеПодборИОбработкаОбъектов.epf
  2. В поле объект поиска выбираем справочник Номенклатура
  3. На вкладке отбор по значениям реквизитов указываем по каким критериям необходимо отобрать элементы справочника. Обратите внимание, что если не установить отбор по реквизиту ЭтоГруппа, то в выборку так же попадут и группы, чего нам не нужно
  4. Жмем кнопку Найти объекты.
  5. Переходим на вкладку Обработки. В дереве Обработка/Настройка добавляем новый элемент в разделе Произвольный алгоритм и пишем код
    НачатьТранзакцию();
    
    ЕдИзм = Справочники.ЕдиницыИзмерения.СоздатьЭлемент();
    ЕдИзм.Владелец = Объект.Ссылка;
    ЕдИзм.Наименование = "Наше наименование";
    ЕдИзм.ЕдиницаПоКлассификатору = // Каким-то образом ищем единицу в классификаторе
    ЕдИзм.Коэффициент = 1;
    ЕдИзм.Записать();
    
    Объект.ЕдиницаХраненияОстатков = ЕдИзм.Ссылка;
    Объект.ЕдиницаДляОтчетов = ЕдИзм.Ссылка;
    Объект.Записать();
    
    ЗафиксироватьТранзакцию();
     
  6. Жмем кнопку Выполнить
Частичный и полный перенос данных между однотипными конфигурациями

   Задача обычно стоит такая: потерялась часть данных из определенных таблиц, которая есть в резервной копии, необходимо перенести документы с движениями, часть справочников.

   Для этого лучше всего подходит обработка ВыгрузкаЗагрузкаДанныхXML82.epf с диска ИТС. Существует версия для платформы 8.1, 8.0. Существует несколько переработанная версия обработки Очень простая в использовании обработка обмена между идентичными конфигурациями , чем она лучше/хуже типовой я не могу сказать, т.к. функционал меня вполне устраивает, а интерфейс интуитивно понятный.

 Как перенести определенные документы:

  1. Открываем обработку ВыгрузкаЗагрузкаДанныхXML82.epf
  2. В дереве отмечаем виды объектов, которые собираемся выгружать (галка слева от названия). Например, документ "Прием на работу в организацию" (рис.7)
  3. Затем, встав на строчке с видом объекта, указываем для него отбор, чтобы определить какие именно объекты надо выгрузить. В своем примере я хочу выгрузить несколько последних документов: указываем отбор по ссылке, вид сравнения в списке (рис. 8)
  4. После этого необходимо определиться, нужно ли выгружать с документом его движения или нет - галка "Выгружать с документом все его движения". Для документов Корректировка записей регистров, Бухгалтерская операция эту галку надо обязательно ставить, т.к. в противном случае вы просто ничего не выгрузите. В своем примере я поставлю эту галку, чтобы не тратить время на перепроведение загруженных документов.
  5. Еще один немаловажный момент - необходимо указать какие объекты стоит выгружать по ссылкам (колонка При необходимости - в дереве видов объектов). Если не отметить в этой колонке ни один объект, то будут выгружены только отобранные объекты - в данном примере - несколько документ Прием на работу в организацию, а ссылочные объекты, такие как Организация, подразделение организации, сотрудник, виды расчета ...  указанные в документе не будут выгружены, выгрузятся только ссылки на эти объекты и если таких объектов в загружаемой базе нет - мы получим "битые ссылки"
  6. Итак, объекты для выгрузки определены, указываем Имя файла в который будут выгружены данные - это временный файл, после загрузки он будет не нужен, поэтому с именем не заморачивайтесь. Жмем кнопку "Выгрузить данные", расположенную на нижней панели. Файл выгружен
  7. Заходим в режиме 1С:Предприятие в ту базу данных, в которую эти данные должны быть загружены
  8. Открываем обработку ВыгрузкаЗагрузкаДанныхXML82.epf, переходим на вкладку "Загрузка"
  9. Указываем Имя файла, жмем кнопку "Загрузить данные"
Картинки 
Рис. 8. ВыгрузкаЗагрузкаДанныхXML
 
Рис. 9. ВыгрузкаЗагрузкаДанныхXML. Установка отбора
 

 Перенос большого справочника по частям

  Эта тема натолкнула меня на мысль о том как можно перенести справочник по частям. Вот пример того как можно перенести справочник Хранилище дополнительной информации несколькими частями:

      1. Открываем обработку ВыгрузкаЗагрузкаДанныхXML82.epf
      2. В дереве Данные для выгрузки снимаешь все галки (рис.7)
      3. Идем на вкладку Дополнительные объекты для выгрузки, жмем кнопку "Добавить объекты для выгрузки ..." (рис.8)
      4. жмем кнопку Выбрать из запроса. Пишем запрос типа: 
        ВЫБРАТЬ
            КОЛИЧЕСТВО(ХранилищеДополнительнойИнформации.Наименование) КАК НПП,
            ХранилищеДополнительнойИнформации.Ссылка КАК Ссылка
        ПОМЕСТИТЬ ПронумерованныйСписок
        ИЗ
            Справочник.ХранилищеДополнительнойИнформации КАК ХранилищеДополнительнойИнформации
                ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ХранилищеДополнительнойИнформации КАК ХранилищеДополнительнойИнформации1
                ПО ХранилищеДополнительнойИнформации.Ссылка >= ХранилищеДополнительнойИнформации1.Ссылка
        
        СГРУППИРОВАТЬ ПО
            ХранилищеДополнительнойИнформации.Ссылка
        ;
        
        ////////////////////////////////////////////////////////////////////////////////
        ВЫБРАТЬ
            ПронумерованныйСписок.НПП КАК НПП,
            ПронумерованныйСписок.Ссылка
        ИЗ
            ПронумерованныйСписок КАК ПронумерованныйСписок
        ГДЕ
            ПронумерованныйСписок.НПП МЕЖДУ 1 И 1000
        
        УПОРЯДОЧИТЬ ПО
            НПП
      5. В место цифр 1 и 1000 пишем те номера элементов справочника по-порядку, которые хотим выгрузить
      6. Жмем Выполнить, ОК. ОК. Сформируется список ссылок 
      7. Выгружаем
      8. Загружаем получившийся файл в базу-приемник
      9. Возвращаемся к пункту 5 пока не выгрузим все элементы
Картинки
Рис.10. ВыгрузкаЗагрузкаДанныхXML. Добавление объектов, отобранных по произвольному алгоритму

 Загрузка данных из других источников

  На этапе ввода в эксплуатацию какой-либо конфигурации 1С или при начале работы с какой-либо подсистемой в уже работающей базой нередко встает задача ввода начальных остатков. Как правило, в таких случаях учет уже ведется в электронном виде, в какой-либо другой системе, иногда просто в excel. Таким образом, задача сводится к вычислению остатков(если вводим остатки) и загрузке остатков, справочников.

  Конечно же можно решать каждую такую задачу отдельно, создавая узкоспециализированную обработку загрузки данных, которая умеет делать только ЭТО и после успешной загрузки её можно удалять, но я в случае

Лучше использовать обработку с ИТС ЗагрузкаДанныхИзТабличногодокумента. Я использую вот эту разработку http://infostart.ru/public/21890/, т.к. она позволяет так же грузить информацию в движения документа - это становится особенно важным, когда необходимо загрузить данные в документ Корректировка записей регистров или в документ Операция (бухгалтерский и налоговый учет)

Пример, как ей пользоваться и в каких случаях она очень актуальна - будет, но чуть позже

Определить какие данные изменяются при выполнении определенных действий

  Не редко в процессе отладки алгоритмов или когда нам приходится просто разбираться как работает чужая программа, или же при отладке загрузки данных с помощью конвертации данных или из других источников возникает необходимость определить, а какие же данные(документы, справочники, регистры) появились в базе данных в результате загрузки. Для решения этой задачи можно воспользоваться журналом регистрации и просматривать его штатными средствами(что не очень удобно), можно этот же журнал загрузить в специализированную базу (например, эта публикация: Конфигурация: Журнал регистрации (управляемое приложение), есть и другие). А можно воспользоваться Планами обмена, если такие присутствуют в конфигурации и обработкой с того же диска ИТС Регистрация изменений для обмена(сейчас она есть во всех типовых).

Итак, как же этим всем пользоваться:

  1. В списке планов обмена выбираем наиболее полный. В типовых он так и называется "Полный". Планы обмена можно открыть через пункт меню Операции->Планы обмена или Все действия->Планы обмена. 
  2. Добавляем новый узел в этом плане обмена. Теперь при записи объектов в базу данных они будут зарегистрированы в этом узле
  3. Далее выполняем нашу обработку/загрузку данных
  4. После этого открываем обработку Регистрация изменений для обмена, выбираем в ней недавно созданный узел плана обмена. Будет построено дерево зарегистрированный изменений
  5. Далее эту регистрацию можно расшифровать - правой кнопкой мыши по объекту метаданных Показать зарегистрированные изменения данного типа

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

Картинки

Рис. 11. Выбор плана обмена

Рис. 12. Добавление нового узла

Рис. 13. Обработка Регистрация изменения для обмена. Просмотр зарегистрированных изменений

См. также

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

Комментарии

1. Анна - (MikaPikina) 28.08.13 18:15
я бы, конечно, не назвала ввод произвольного алгоритма чем-то удобным, мне приятнее нажать на одну кнопку и получить счастье, но такую штуку нужно иметь под рукой - мало ли что))
2. Александр Крынецкий (echo77) 28.08.13 18:27
(1) Согласен, произвольный алгоритм удобнее предварительно готовить в конфигураторе. Но универсальный подбор и обработка объектов создает всю обвязку, избавляя программиста от создания первичного интерфейса и описания процедур отбора по определенным критериям.
3. Алексей Т. (CratosX) 04.09.13 03:15
консоль кода из мобильных ИР в помощь
4. Петр (plus1s_a) 04.09.13 06:12
Пользуюсь. Еще полезно в коде обработки ...
Объект.ОбменДанными.Загрузка = Истина;
RodinMax; Painted; +2 Ответить
5. Руслан Бозжанов (Lion heart) 01.10.13 11:48
Есть еще замечательные служебные обработки ПоискИЗаменаЗначений.epf и ПоискИЗаменаДублирующихсяЭлементовСправочников.epf
RodinMax; echo77; +2 Ответить
6. Михаил Афанасьев (mikmike) 29.10.13 19:47
В качестве бонуса к публикации прикреплены все вышеперечисленные обработки. Групповая обработка справочников и документов доработана так, что её можно запустить в любой конфигурации

Где, если не секрет?
7. Александр Крынецкий (echo77) 29.10.13 21:42
(6) Вот здесь : http://dfiles.ru/files/nfn9ome6d

удалил из публикации, чтобы сделать её "публикацией"
8. Михаил Афанасьев (mikmike) 30.10.13 07:06
(7) echo77, вот теперь соответствует все. Правда ресурс не самый лучший - все-таки у него репутация еще та, да и процесс скачивания замудреный. Может быть лучше в обычном облаке типа яндекс.диска выложить. Там есть возможность расшарить файл.
9. Migel M. Volos (Cartman) 07.02.14 11:48
(8) mikmike, переложил в облако за автора пока.
https://cloud.mail.ru/public/f36fbb65b2be/1Cv82Scripts.zip

А статья отличная, очень полезная.
10. юрий гулидов (gull22) 23.05.14 10:18
11. Юрий Машков (newtype) 16.08.15 10:58
12. Сергей Старых (tormozit) 16.08.15 11:43
Еще есть подсистема Инструменты разработчика, позволяющая решить во многом с большими возможностями и удобством некоторые из описанных задач:
- Удаление помеченных объектов немонопольно, по типам объектов - инструмент "Удаление объектов с контролем ссылок"
- Перенумерация справочников, документов - инструмент "Подбор и обработка объектов"
- Групповое изменение реквизитов объектов, реквизитов подчиненных объектов - инструмент "Подбор и обработка объектов"
- Частичный и полный перенос данных между однотипными конфигурациями - инструмент "Выгрузка загрузка данных через файл"
aspiration; Painted; KSy; echo77; +4 Ответить
13. Muxomop Muxomop (Muxomop) 19.08.15 13:46
Полезная статья, особенно для тех, кто любит изобретать велосипед)
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа