1с объединить элементы справочника
Войдите как ученик, чтобы получить доступ к материалам школы
Язык запросов 1С 8.3 для начинающих программистов: объединение
Автор уроков и преподаватель школы: Владимир Милькин
Объединение в запросах
В языке запросов имеется возможность объединять несколько запросов. При этом записи, полученные с помощью каждого из объединяемых запросов, будут собраны в один результат запроса.
Как всегда начнём с примера.
Пусть требуется написать запрос, который возвращает все названия цветов и вкусов в одной таблице.
Цвета мы умеем выбирать так:
А вот, чтобы объединить эти два результата в один как раз и потребуется операция объединения:
Обратите внимание на то, что операция объединения вовсе не гарантирует, что элементы будут идти в каком-то определённом порядке. В общем случае они могут следовать друг за другом как угодно, поэтому если важен порядок необходимо как и всегда указывать его явно (через секцию УПОРЯДОЧИТЬ).
Требования к запросам, участвующим в объединении
У объединяемых запросов должно быть одинаковое количество полей . Иначе мы получим такую ошибку:
В объединяемых запросах соответствующие друг другу (по порядку) поля должны иметь одинаковый тип . Но это требование, в отличие от предыдущего, не является обязательным. Если соответствующие друг другу поля имеют разный тип, то поле результата будет иметь СОСТАВНОЙ тип, который разбирался нами на одном из прошлых уроков:
Несмотря на то, что поле первого запроса имеет тип СТРОКА, а второго ЧИСЛО, нам удалось объединить их в одну таблицу. Но тип результатирующего поля стал составным и нам придётся учитывать это в дальнейшем. Вы читаете ознакомительную версию урока, полноценные уроки находятся здесь.
Кстати, вы заметили, что поле итоговой таблицы (после объединения) называется Наименование, а не Калорийность? Эта такое правило : поля итоговой таблицы всегда имеют названия совпадающие с именами описанными в первом из объединяемых запросов.
Объединение более двух запросов
При объединении каждый запрос собирает данные независимо, а уже затем результаты объединяются в один. Количество объединяемых запросов не ограничено.
Напишем объединение трёх запросов:
Повторяющиеся строки
Давайте объединим один и тот же запрос сам с собой:
Обратите внимание на то, что мы объединили две одинаковые таблицы цветов, а в результате каждый цвет встречается ровно один раз.
Всё потому, что по умолчанию при объединении запросов полностью одинаковые строки в результате запроса, заменяются одной. Вы читаете ознакомительную версию урока, полноценные уроки находятся здесь.
Если требуется, чтобы были оставлены в том числе одинаковые строки (дубли), необходимо указать ключевое слово ВСЕ:
Упорядочивание при объединении
Пытаться отдельно упорядочивать результаты запросов, участвующих в объединении не имеет смысла. Поэтому при попытке написать:
Упорядочивать можно только результат объединения :
Обратите внимание на то, что секция УПОРЯДОЧИТЬ ПО в данном случае относится не к последнему запросу, а уже к результату объединения запросов.
Подведение итогов при объединении
Пытаться отдельно подводить итоги по запросам, участвующим в объединении, также не имеет смысла. Поэтому при попытке написать:
Подводить итоги можно только по результату объединения :
Обратите внимание на то, что секция ИТОГИ ПО в данном случае относится не к последнему запросу, а уже к результату объединения запросов.
Рабочий пример
Давайте решим такую задачу. Требуется вывести для каждого элемента справочника Еда закупленное и проданное количество за весь период.
Поступление еды у нас в базе происходит документом ПоступлениеЕды. У документа есть табличная часть Еда, с реквизитами Номенклатура и Количество.
Сначала выберем все строки табличной части Еда из всех поступлений:
Теперь сгруппируем этот результат по еде с суммированием количества:
Аналогичным образом получим продажу еды из документов ПродажаЕды:
Осталось объединить эти два запроса:
Обратите внимание на то, как мы дополнили оба запроса ещё одним полем СУММА(0). Мы вынуждены были сделать это, так как оба запроса содержат по два поля, а объединение запросов должно содержать три поля. Вы читаете ознакомительную версию урока, полноценные уроки находятся здесь. Если бы мы не сделали этого, а написали просто:
Если за базой не следить, вовремя не подчищать, то неизбежно дублирование информации. Наиболее часто дублируются номенклатура и, конечно же, контрагенты.
В 1С:Бухгалтерия 8.3 уже встроен механизм для поиска и устранения дублей. Это универсальная обработка "Поиск и удаление дублей", которая подходит для поиска дубликатов не только в номенклатуре и контрагентах, но и в других справочниках.
Рассмотрим её использование на примере справочника "Контрагенты".
Ситуация
1. Итак, у нас есть контрагент "Аэрофлот" в папке покупатели.
2. И его дубликат (полная копия), случайно заведенная в папке поставщики. ИНН у обоих элементов совершенно одинаковый.
Наша задача воспользоваться обработкой по поиску и замене дублей так, чтобы она нашла эти элементы, указала (сопоставив их ИНН), что один дублирует другого и объединила их в один элемент.
Открываем обработку
3. Чтобы открыть обработку для поиска дублей нужно зайти в меню "Функции для технического специалиста. "( Если у вас его нет - вам сюда. ).
И выбрать среди всех обработок "Поиск и удаление дублей".
Настраиваем условия
4. Форма обработки перед нами. Укажем область для поиска дублей, нажав на три точки в поле "Искать в".
5. Выберем "Контрагенты" и нажмем кнопку "Выбрать".
6. Нажмем на кнопку троеточие в поле "Пометка удаления равно нет":
7. И добавим ещё одно правило отбора (кнопка "Добавить новый элемент").
8. В качестве поля для отбора выберем .
10. В качестве вида сравнения укажем "Заполнено" и нажмём кнопку ОК:
Таким образом мы будем осуществлять поиск среди всех контрагентов, у которых заполнен ИНН.
11. Осталось задать критерий для сравнения. Нажмите пункт "Наименование совпадает по похожим словам".
12. В открывшихся правилах поиска дублей снимите галку рядом с полем "Наименование".
Ищем дубли
14. Внизу окна нажмите кнопку "Найти дубли".
15. А вот и наш аэрофлот. Вернее два аэрофлота. И места использования каждого из них. Тот аэрофлот, рядом с которым зеленая стрелка, 1С считает главным и при удалении дублей останется именно он. Если выбор 1С оказался ошибочен - выделите другой элемент и нажмите кнопку "Отметить как оригинал". Установите галки рядом с элементами, которые по-вашему мнению являются дублями главных элементов. Теперь нажмите кнопку "Удалить дубли".
16. Обработка рапортует нам, что дубли объединены в один элемент и теперь вместо двух аэрофлотов у нас один, что и требовалось получить!
Мы молодцы, на этом всё
Кстати, подписывайтесь на новые уроки.
Важное замечание
Друзья, отдельно хочу заострить внимание на моменте, который ставит в тупик многих пользователей (я и сам не сразу это понял).
Обработка позволяет сравнивать поля друг с другом всего по двум правилам (пункт "Сравнивать"):
- полное совпадение
- совпадение по похожим словам, причём мы не можем настраивать эту похожесть
Всё. Других вариантов нет.
Это значит, что мы не можем настроить обработку на поиск дублей по своему принципу.
Например, нам не удастся настроить её так, чтобы она посчитала дублями все элементы, в которых встречается нужное нам слово.
Мы можем только сказать: ищи нам дубли среди такого-то справочника, при этом считай дублями те элементы у которых совпадают такие-то поля или полностью или похожи друг на друга. При этом как именно они похожи - решай сама.
Поле "Отбирать", которое и вводит всех в заблуждение, потому что оно расположено первым, предназначено для отбора элементов, которые обработка уже посчитала дублями.
То есть, если вы в поле "Отбирать" поставили "Все элементы" и дубли не нашлись - смысл в настройке поля "Отбирать" нет. Оно позволяет только сузить результаты, но не расширить.
Уфф. надеюсь я кому-то помог сэкономить время. До меня самого почти час доходило что же я делаю не так.
А тем кому нужен более настраиваемый поиск по дублям я советую подсистему "Инструменты разработчика".
Только нужно учесть, что она уже для очень опытных пользователей. Начинающим может быть нелегко с ней разобраться.
С уважением, Владимир Милькин (преподаватель школы 1С программистов и разработчик обновлятора).
Как помочь сайту: расскажите (кнопки поделиться ниже) о нём своим друзьям и коллегам. Сделайте это один раз и вы внесете существенный вклад в развитие сайта. На сайте нет рекламы, но чем больше людей им пользуются, тем больше сил у меня для его поддержки.
Дата публикации 13.11.2019
Использован релиз 3.0.73
Обработка "Поиск и удаление дублей" используется для поиска в информационной базе ошибочно введенных дублирующих друг друга элементов и ссылок на них, автоматической замены всех ссылок на дубли ссылками на выбранный "правильный" элемент и установки на дубли пометки на удаление.
- Раздел: Администрирование – Обслуживание.
- В блоке "Корректировка данных" перейдите по ссылке "Поиск и удаление дублей".
- Установите правила поиска дублей и запустите поиск:
- В поле "Искать" выберите область поиска (справочник, вид документа и др.) (рис. 1).
- В поле "Отбирать" задайте условия, по которым будут отбираться элементы для поиска дублей – по кнопке "Выбрать" (в поле справа) откройте форму "Правила отбора", добавьте правила (кнопка "Добавить новый элемент") и укажите для каждого правила элемент отбора, вид сравнения и значение.
- По ссылке в поле "Сравнивать" установите правила поиска дублей – отметьте флажками реквизиты, при совпадении которых элементы будут считаться дублями (рис. 2). Совпадение может быть полным (правило "Совпадает") или неполным (правило "Совпадает по похожим словам" (не для всех реквизитов)).
- Запустите поиск дублей по кнопке "Найти дубли".
- После выполнения поиска в левое окно формы будут выведены элементы, имеющие дубли, в правое окно – объекты, которые имеют ссылки на найденные элементы с дублями (рис. 3). Элемент с наибольшим количеством ссылок на него автоматически признается основным (оригинальным) и помечается значком (рис. 3).
- По кнопке "Отметить как оригинал" можно изменить основной (оригинальный) элемент (рис. 4).
- По кнопке "Удалить дубли" на основной (оригинальный) элемент будут перенесены все ссылки из объектов информационной базы, а дубли будут помечены на удаление.
- Удаление помеченных объектов выполняется обработкой "Удаление помеченных объектов" (раздел: Администрирование).
Перемещение и объединение элементов справочника
В некоторых иерархических справочниках возможно перемещение элементов (из одной вершины в другую или внутри одной вершины), а также слияние нескольких элементов в один. Эти процедуры выполняются в два действия – сначала элементы вырезаются из списка и помещаются в буфер, затем вставляются на новое место или объединяются с требуемым элементом.
Эти операции возможны, например, в справочниках:
- Регионы (перемещение и объединение элементов);
- Рубрики (перемещение и объединение элементов);
- Состояние исполнения (поручение) (объединение элементов);
- Состояние исполнения (исполнитель) (объединение элементов).
Внимание. Операцию объединения элементов справочников можно выполнять только в условиях, когда другие пользователи не работают в основных приложениях системы.
- Выделите в списке элементов справочника нужный элемент. Для этого отметьте его курсором и нажмите клавишу Пробел, или сначала нажмите клавишу Ctrl и отметьте элемент курсором. Можно выделить сразу несколько элементов, щелкая на них мышью при нажатой клавише Ctrl .
- Выберите из меню Управление команду Вырезать или щелкните кнопку на панели инструментов. Отметим, что данная команда активизируется только при наличии в окне выделенных элементов. Выделенные элементы будут вырезаны и помещены в буфер обмена. При этом в меню Управление станут активными команды Вставить и Соединить , а на панели инструментов – кнопки , , соответствующие этим командам.
- Откройте вершину, в которую следует поместить элементы, находящиеся в буфере и выделите в ней элемент, под который в списке они должны быть вставлены.
- Выберите из меню Управление команду Вставить или щелкните кнопку на панели инструментов. Отметим, что данная команда активизируется только при наличии в буфере вырезанных и не вставленных элементов. Элементы из буфера будут вставлены в текущую вершину под текущий (выделенный) элемент.
При объединении элементов все существующие в системе ссылки на поглощенные элементы, автоматически переназначаются на тот элемент справочника, который поглотил все остальные. Другими словами, если, например, в каком-либо реквизите РК было указано название поглощенной рубрики, то после слияния элементов в этом реквизите автоматически будет установлено название той рубрики, которая ее поглотила. После объединения поглощенные элементы физически удаляются из справочника.
Дочерние элементы поглощенных вершин перемещаются в вершину, которая их поглотила.
Читайте также: