Известно, из четырех SQL-операторов манипуляции данными (SELECT, INSERT, UPDATE и DELETE) в 1С реализован лишь первый. Представленная обработка позволяет в некотором смысле имитировать весь набор интерактивного SQL. При этом интерактивность явная, основанная на таких мощных механизмах платформы 1С как система компоновки данных и управляемые формы. Поясню о чем речь. Предположим, стоит задача удалить все нулевые цены из регистра сведений "Цены номенклатуры" Вот оператор SQL:
DELETE FROM ЦеныНоменклатуры WHERE Цена = 0;
В 1С для этого требуется написать обработку, которая бы отобрала бы записи регистра по заданному условию, сгруппировала их по регистратору и последовательно для каждого регистратора читала набор с нужным фильтром (Цена = 0), очищала его и записывала.
Используя предлагаемый инструментарий, пользователь выбирает регистр(1), накладывает фильтры(2), получает данные для редактирования(3), далее жмёт cntr+A, клавиша Del и кнопка "Записать изменения в регистр(4)".
При этом будет составлен протокол выполненных действий по изменению данных в регистре. И как в любом уважающем себя редакторе эти изменения можно будет откатить, а потом снова вернуть. Глубина стека откатов и возвратов не ограничена в рамках одного сеанса редактирования. Схема изменения/добавления данных аналогична - выбор регистра, отбор, в сеансе редактирования меняем данные, вручную или при помощи команды Установить значение колонки выделенных строк и сохраняем изменения. Таким образом, никакого программирования. Только интерактивные действия по отбору и изменению табличных данных.
Принцип реализации:
Для отбора используется программно-формируемый динамический список, на основе заданного регистра или произвольного запроса. Динамический список расположен на закладке Отбор. Динамический список содержит кнопки управления поиском и другой стандартный функционал. После установки отбора в динамическом списке командой Начать сеанс редактирования формируем таблицу значений отобранных записей регистра, с учетом периода и ограничения выборки. Если отбор не установлен - команда не доступна. Это предотвращает выгрузку не лимитированных объемов данных.
На закладке Редактор находится таблица значений, полученная по результатам отбора. Эту таблицу можно произвольно редактировать, используя стандартные механизмы управляемых форм и дополнительные команды. После завершения правок можно выполнить команду Записать изменения в регистр, которая создаст таблицу различий двух таблиц - исходной и отредактированной. Алгоритмы сравнения таблиц взяты из публикации //infostart.ru/public/326983/, за что отдельная благодарность их автору. Эта таблица используется для исполнения операций корректировки наборов записей в регистрах. В силу специфики 1С мы не можем получить записи с разными значениями стандартного реквизита Регистратор для записи изменений, поэтому в терминах SQL эти операции будут выполняться последовательно, одна за другой:
DELETE TOP(n) FROM ЦеныНоменклатуры WHERE Регистратор = «Регистратор1» and Цена = 0;
DELETE TOP(n) FROM ЦеныНоменклатуры WHERE Регистратор = «Регистратор2» and Цена = 0; и т.д.
Или
UPDATE TOP(n) ЦеныНоменклатуры SET Цена = 123 WHERE Регистратор = «Регистратор3» and <условия>
UPDATE TOP(n) ЦеныНоменклатуры SET Цена = 123 WHERE Регистратор = «Регистратор4» and <условия>
Чтобы избежать ненужных вопросов хочу сразу предупредить, что никаких SQL-операторов в обработке нет. В этой публикации они предназначены лишь для более наглядного описания функционала инструментария и, тем самым, более полного его освоения.
Операнд TOP(n) показывает, сколько первых записей удовлетворяющих всем условиям будут изменены. Значение n задается в специальном поле Ограничение коррекций. Как правило, в пределах подчиненности конкретному регистратору записей удовлетворяющих грамотно наложенным фильтрам не более одной. Поэтому значение этого параметра следует устанавливать в единицу. В некоторых случаях этот параметр может быть увеличен, чтобы позволить изменить одной операцией сразу множество записей удовлетворяющих простому условию. Например, удалить все цены при условии: Валюта = USD. Если параметр Ограничение коррекций будет равен 1, то удалится только одна запись; если 100 – сто записей (если они найдутся) в пределах конкретного регистратора. Если указанный параметр будет равен нулю, то обработка не меняет никаких данных.
Она работает в тестовом режиме.
В этом режиме делаются все отборы, все замены, ведется протокол выполненных действий. Отличие от рабочего режима только одно: метод регистра Записать() не исполняется. Тестовый режим служит для изучения и проверки протокола по изменению данных. Если все удовлетворяет – меняем тестовый режим на рабочий увеличением параметра Ограничение коррекций и запускаем на исполнение.
Флаги: Обмен данными загрузка, Выполнять в транзакции, Различать незаполненные предназначены для настроек исполнения процедуры записи в регистр. Смысл последнего параметра станет понятнее, если ознакомиться с публикацией //infostart.ru/public/1142232/
С правой стороны расположена настройка колонок таблицы редактирования. Наименования колонок-измерений регистра имеют красный цвет, колонок-ресурсов - синий. Сверху расположены колонки стандартных реквизитов, снизу - реквизиты самого регистра. Колонка может иметь статус поля поиска (используются при формировании набора записей) или поля изменения. Колонка без установленного статуса не отражается в таблице редактирования.
Как задавать условия?
Поля для отбора пользователь указывает на панели Настройка в колонке поиска. Чем больше задано полей для поиска, тем точнее будут отобраны записи. Два замечания: отбор по Регистратору используется всегда, отбор и изменение реквизита «Номер строки» всегда игнорируется. Номер строки генерируется штатным функционалом платформы 1С без участия пользователя/программиста.
Как изменять данные в редакторе?
Чтобы изменить данные в колонке необходимо сделать эту колонку доступной для редактирования. Колонку можно заполнить с помощь команды Установить значение колонки выделенных строк.
Если в диалоге выбора значения для заполнения отказаться от ввода, программа предложит заполнить колонку пустым значением. Тип пустого значения определяется переключателем Значение Неопределено позволяет по возможности установить пустую ссылку соответствующего типа. Это удобно когда необходимо, например, установить пустую характеристику для разных значений номенклатуры.
Изменение поля Регистратор оформляется условным оформлением. При этом, в качестве регистратора можно выбрать любой доступный по типу объект, в том числе помеченный на удаление (проверено) и даже битую ссылку <Объект не найден> (не проверял). Хотя такие подмены не имеют практического применения, тем не менее они возможны. Как уже отмечалось, Регистратор всегда используется как поле поиска поэтому, при записи результата в регистр запись со старым значением регистратора будет удалена , а другая добавлена – с новым значением регистратора. Тот же эффект возникнет, когда мы изменим какое-то поле, например «Сумма», а потом укажем его предметом поиска записей. Запись со старым значением Суммы будет удалена, а с новым добавлена. Если же поле «Сумма» не будет полем поиска, то запись будет просто изменена. Все эти манипуляции будут соответствующим образом отражены в протоколе.
Закладка Протокол отражает ход операций по изменению данных. Протокол очищается перед каждым исполнением команды Записать изменения в регистр.
Закладка Остатки содержит результат выполнения команды Сформировать остатки по отмеченным полям панели Настройка на конец периода выборки или на текущий момент, если период не установлен. Эта команда реализована двумя способами:
1. Если включен флаг Произвольный запрос то для получения информации СКД формируется на основе двух наборов данных – набор данных запрос к основной таблице регистра соединенной с набором данных объект, в качестве которого выступает таблица значений на закладке Редактор. Для полей связи используются реквизиты-измерения регистра.
2. Если флаг отключен, то используется только набор данных запрос к основной таблице регистра, с установленными отборами из динамического списка. В этом случае обеспечивается более высокая скорость операций к базе данных, но уменьшается гибкость установки фильтров.
После получения остатков командой Оформить корректировку можно создать и заполнить документ корректировки регистров, обнуляющий все ресурсы этого регистра по выбранным строкам. Для указания документа корректировки необходимо заранее заполнить поле Тип документа корректировки.
Закладка Текст Запроса становится доступной при установленном флаге Произвольный запрос и содержит варианты запросов для формирования динамического списка на закладке Отбор. Переключение между вариантами происходит при активизации строки табличного поля и отражается в шапке (поле Вариант). Зачем нужен произвольный запрос. Тривиальный случай – необходим отбор по типу регистратора. Выводим это поле в произвольном запросе и вуаля!
Иногда можно ограничиться отбором по части строки:
Или настройкой списка
Но в этом случае невозможно корректно Сформировать остатки в связи со спецификой отбора.
Существует две комплектации инструментария: базовая и полная
Базовая комплектация - строит динамический список выбранного регистра с параметром Произвольный Запрос = ЛОЖЬ.
Полная комплектация - позволяет строить более сложные списки на основе произвольного запроса. Конструктор запроса на управляемых формах входит в полную комплектацию. Кроме того в полной комплектации доступен функционал получения остатков и оформления корректировок.
Каждая комплектация состоит и пяти обработок: 4 по видам регистров и одна сводная для всех видов. Вы можете скачивать по своему выбору любые из них. Визуально обработка разделена на параметры выполнения и отбора, глобальные команды, а также закладки. Названия команд, параметров и закладок интуитивно понятны и отражают их предназначение.
Глобальные команды: Начать сеанс редактирования, Записать изменения в регистр, Пересчитать итоги (для регистров сведений накопления и бухгалтерии).
Глобальные параметры: Тип метаданных (регистры сведений, накопления, бухгалтерии, расчёта), Тип регистра, Период выборки, Ограничение выборки, Ограничение коррекций.
Для полной комплектации доступные параметры Тип документа корректировки, Произвольный запрос и Вариант.
Примечание 1. Независимые регистры сведений можно редактировать сразу на закладке Отбор. Они выделяются в зеленой рамке:
Примечание 2. У регистров бухгалтерии есть две формы редактирования движений: Стандартная и ДвиженияССубконто
Примечание 3. У регистров расчета в качестве периода выборки используется Период Регистрации
Примечание 4. Обработка предназначена для платформы начиная с релиза 1С:Предприятие 8.3 (8.3.12.1412)
Обработка тестировалась на платформе 1С:Предприятие 8.3 (8.3.14.1854) и конфигурациях:
1С:ERP Управление предприятием 2 (2.4.10.56)
1С:Комплексная автоматизация 2 (2.4.7.151)
1С:Зарплата и управление персоналом, редакция 3.1 (3.1.10.111)