Таблицы в 1С
В системе 1С почти все состоит из таблиц: табличные части, списки документов, справочники, регистры, отчеты и т.д. Отдельный вопрос – как их обрабатывать? Платформа предоставляет базовые функции для работы с таблицами, например, вывод списка объектов (документы/справочники) в табличный документ, загрузка/выгрузка в excel-файл. Также во многих конфигурациях есть дополнительные функции работы с таблицами, которые предусмотрели разработчики, например, в готовом отчете можно просуммировать выделенные ячейки, внешние обработки табличных частей. В основном этих инструментов хватает только для самой простой обработки информации в таблицах, либо эти инструменты очень специфичны под конкретную задачу. Бухгалтера постоянно выгружают таблицы в Excel, чтобы сводить итоги, крыжить строки, сравнивать суммы по определенным отборам… Программисты тоже часто пишут много похожего кода для обработки таблиц при поиске ошибок и отладки запросов.
Табличный процессор
Была цель расширить функционал работы с таблицами, дополнить гибкими универсальными функциями возможности платформы и конфигурации. В результате получился программный продукт «Табличный процессор». Реализован в виде внешней обработки, которую можно вставить в любую конфигурацию на платформе 1С:Предприятие 8.3.
В обработке используются функции анализа строковых выражений из предыдущих разработок (часть описана здесь //infostart.ru/1c/articles/1343680/). Это позволяет накладывать отборы и применять формулы любой сложности на интуитивно понятном языке. Например, можно выбрать или заменить остатки только по определенным контрагентам, удовлетворяющих условию. Допускается использование стандартных операторов «И», «Или», «Не»; арифметических операторов, скобок; полей и подполей объектов; чисел; дат; строк и выражений из них. Еще один шаг к универсальности.
Конечно, не получится создать обработку «на все случаи жизни». Табличный процессор – это набор инструментов для работы с таблицами в 1С, дополняющий возможности платформы и любой конфигурации. Функций табличного процессора много, их списание по группам будет в следующих разделах.
Основные функции, претендующие на новизну (ноу хау):
- Распознание и загрузка всех таблиц из Excel-файла (шапка и строки таблиц распознаются по рамкам)
- Произвольное изменение одной или нескольких колонок таблицы по формуле, при необходимости ограниченных отбором
- Создание колонок таблицы по формуле (в формуле можно использовать текущие колонки таблицы и номер строки)
- Работа с несколькими таблицами
- Создание таблицы по формуле из других таблиц (допускается сложение/вычитание таблиц, умножение/деление на число)
- Получение распределения таблицы по ключу (записи таблицы распределяются на группы по всем наборам значений ключа, который может состоять из нескольких полей)
- Получение и запись таблиц в регистры (обрабатываются таблицы остатков, оборотов, срезов и записей регистров, допускается наложение отборов, есть функция замены таблиц)
- Работа в толстом и тонком клиентах, на обычных и управляемых формах (функционал единый, интерфейс немного отличается ввиду особенностей управляемых форм)
- Сравнение таблиц (Сравнение авторским алгоритмом «по ячейкам» и встроенным алгоритмом сравнения текстов)
Действия над таблицей
Действия с таблицей выполняются в разделе "Таблица", в подразделе «Действия». Слева редактируется текущая таблица. В поле действие выбирается нужная функция, в момент выбора заполняются дополнительные параметры для запуска данной функции ниже кнопки Выполнить. После настройки параметров нажимаем «Выполнить».
Далее будут описаны функции (действия) раздела.
Изменить ячейки
Заполнить таблицу, используя формулу для колонок. В формуле может быть несколько формул для разных колонок вида:
ИмяКолонки1=<Выражение1>; ИмяКолонки2=<Выражение2>; …
В формуле можно использовать текущие колонки таблицы, константы, арифметические и логические операции. Также доступна переменная с номером строки, имя которой можно переопределить (задается в параметрах, по умолчанию «N»).
При необходимости задается произвольный отбор, для ограничения обрабатываемых строк.
Входные поля: Формула (Строка), Номер Строки (Строка), Отбор (Строка).
Таблица в Текст
Вывести строки таблицы в текст по шаблону. При выборе данного действия автоматически заполнится параметр «Шаблон» из текущих колонок таблицы. В шаблоне колонки обрамляются квадратными скобками, остальные символы переносятся «как есть».
Входные поля: Шаблон (Строка).
Таблица в Макет
Открыть текущую таблицу в редакторе макета на закладке «Макет». В редакторе можно получать сумму и среднее чисел из выделенных ячеек. Ячейки выделяются с помощью клавиш Shift и Ctrl.
Выгрузить
Выгрузить таблицу в файл в нужном формате. Если выбрать формат файла Авто (по умолчанию), система определит формат файла по расширению файла. Выгружать можно шапку, строки и подвал в любой комбинации.
Входные поля: Файл, Формат файла (Авто, Текст, Excel, Word, MXL, CSV, PDF, HTML, OpenOffice), Шапка (Булево), Строки (Булево), Подвал (Булево).
Загрузить
Загрузить таблицу из файла. Если выбрать формат файла Авто (по умолчанию), система определит формат файла по расширению файла. При загрузке из Excel система будет искать первую таблицу, обведенную рамкой. Из первой строки будут импортированы имена колонок (Если имя пустое или повторяется, будет сгенерировано новое и уникальное).
Входные поля: Файл, Формат файла (Авто, Текст, Excel, MXL, CSV).
Разделить на группы
Таблица разделяется на группы по ключу (по одной или нескольким колонкам). В каждой группе будут строки с одинаковым набором значений ключа. При данной операции открывается подраздел «Группы».
Если присутствует колонка «Ссылка» и определен реквизит вид, то в группах можно выбрать фаворита. В правой части также будут доступны кнопки «Найти фаворитов» (в группах по максимальному количеству ссылок на объекты определятся фавориты) и «Объединить» (заменить все объекты в группе на фаворита). Это доработанный функционал обработки «Удаление дублей».
Добавить колонку
Создание колонки таблицы по формуле. В формуле можно использовать текущие колонки таблицы, константы, арифметические и логические операции. Также доступна переменная с номером строки, имя которой можно переопределить (задается в параметрах, по умолчанию «N»).
Входные поля: Формула (Строка), Номер Строки (Строка).
Свернуть
Свернуть таблицу по колонкам ключа. Таблица группируется по всем комбинациям значений полей ключа. Колонки, которые не входят в ключ, суммируются в каждой группе, так называемые ресурсы. В результате для каждой группы будет одна строка. Итоговая сумма ресурсов не поменяется, просто перераспределится в таблице. Стандартная операция сворачивания таблицы по нескольким (или 1) колонкам в 1С.
Есть возможность удалить нулевые строки по колонкам ресурсов.
Входные поля: Удалить нулевые строки (Булево).
Операция
Применить операцию к ячейкам ключа. Описание операций:
ЗаменитьПС – заменить все пробельные символы (табуляции, перевод строки, возврат каретки, непереносимый пробел) на простые пробелы,
БезДублейПС – удалить задублированные пробелы,
Наименование – применить операции ЗаменитьПС и БезДублейПС,
СокрЛ, СокрП, СокрЛП – убрать пробельные символы слева, справа, слева и справа,
Строка – преобразовать в строку,
НРег, ВРег – преобразовать регистр в нижний, верхний,
ЗРег – преобразовать регистр в верхний только для 1 символа каждого слова остальные не трогать,
ЗРег1 – как «Зрег», только для первого слова,
ТРег - преобразовать регистр в верхний только для 1 символа каждого слова, остальные в нижний,
ВРег1 – преобразовать регистр в верхний только для 1 символа остальные нижние,
Номер – получить номер без префикса и постфикса,
Номер* - получить все номера через пробел,
Форматировать – отделить цифры от слов,
Обезличить – скрыть информацию из текста,
Число – преобразовать в число,
Модуль – убрать знак у чисел,
ПоменятьЗнак – значение умножается на (-1),
КодEAN – получить добавочный 2-х символьный хэш-код для штрих-кода,
Дата – получить дату из строки с автораспознаванием формата.
Входные поля: Операция.
Удалить пустые строки
Удалить пустые строки таблицы. Строка удаляется, если функция "ЗначениеЗаполнено" вернет Ложь для всех значений колонок, не входящих в ключ.
Входные поля: <Нет>.
Таблица из записей регистра
Заполнить таблицу из записей регистра (все, кроме регистров расчета) за интервал дат с Дата1 по Дата2. Если Дата1 не задана, то записи выбираются с начала движений. Аналогично, если Дата2 не задана, то записи выбираются до самой последней.
Допустимо использовать произвольный отбор.
Также есть обратная операция (см. функцию «Таблица в записи регистра»). Можно загрузить записи по регистру (все или по отбору), внести корректировки и записать измененные данные обратно в регистр.
Входные поля: Регистр сведений/накоплений/бухгалтерии, Отбор (Строка), Дата1, Дата2.
Таблица из остатков регистра
Заполнить таблицу из остатков регистра накопления (вид регистра=Остатки) или регистра бухгалтерии на определенную дату (либо итоговые остатки, если дата не заполнена). Регистры накопления делятся на 2 вида: остатки и обороты. Остатки можно получить только по остаточному регистру накопления либо по регистру бухгалтерии по выбранному счету.
При получении таблицы заполняется ключ из измерений регистра накоплений и субконто регистра бухгалтерии.
Допустимо использовать произвольный отбор.
Также есть обратная операция (см. функцию «Таблица в остатки регистра»). Можно загрузить остатки по регистру (все или по отбору), внести корректировки и записать измененные данные обратно в регистр.
Входные поля: Регистр остатков, Отбор (Строка), Дата (Дата).
Таблица из оборотов регистра
Заполнить таблицу из оборотов регистра накоплений или регистра бухгалтерии за период (или за все время, если даты не заданы). Аналогично предыдущей функции. Обороты можно получить развернуто: вместо одной колонки ресурса в результирующей таблице будет 2 колонки с постфиксами Приход, Расход.
Также есть обратная операция (см. функцию «Таблица в обороты регистра»). Можно загрузить остатки по регистру (все или по отбору), внести корректировки и записать измененные данные обратно в регистр.
Входные поля: Регистр остатков/оборотов, Отбор (Строка), Дата1 (Дата), Дата2 (Дата), Развернуто (Булево).
Таблица из среза регистра
Заполнить таблицу из среза периодического регистра сведений на дату (либо итоговый срез, если дата не заполнена). Можно получить срез первых с помощью соответствующего параметра, но обычно это не популярная функция. Если установить флаг «С Периодом», то в таблицу добавится колонка Период.
Допустимо использовать произвольный отбор.
Также есть обратная операция (см. функцию «Таблица в срез регистра»). Можно загрузить срез по регистру (все или по отбору), внести корректировки и записать измененные данные обратно в регистр.
Входные поля: Регистр сведений, Отбор (Строка), Дата (Дата), С Периодом (Булево), Срез первых (Булево).
Таблица в записи регистра
Записать таблицу в записи регистра сведений/накоплений или регистра бухгалтерии.
Записи всех регистров, кроме независимых регистров сведений, должны принадлежать документу (регистратору). У каждого вида документов в конфигурации определен свой набор регистров, по которым документы этого вида могут иметь движения (записи регистров). Также в конфигурациях обычно присутствует специальный документ Корректировки регистров, с помощью которого хирургически исправляются движения регистров. В зависимости от конфигурации название этого документа может быть разным: КорректировкаЗаписейРегистров (старые версии), КорректировкаРегистров (УТ11), ОперацияБух (БП3), Корректировка (Альфа-Авто) и др.
Если в параметрах будет указан Документ, то Процессор запишет таблицу в движения документа по указанному регистру (предварительно очистив их у данного документа). Если Документ не задан, то Процессор попытается определить вид документа Корректировки регистров в данной конфигурации. В случае успеха будет создан и заполнен новый документ Корректировки регистров на заданную Дату.
Входные поля: Регистр, Документ (Документ), Дата.
Таблица в остатки регистра
Записать таблицу в остатки регистра накопления (вид регистра=остатки) или регистра бухгалтерии на дату.
Если в параметрах установлен флаг Замена, то Процессор запишет разницу между данными в таблице и текущими остатками на Дату. В результате остатки по регистру будут такими же как в исходной таблице. Допустимо использовать произвольный отбор, чтобы изменить остатки локально, например, заменить остатки взаиморасчетов по контрагентам из одной группы.
Остатки по регистру бухгалтерии обрабатываются с указанием счета в названии регистра. При выборе регистра для каждого счета из плана счетов будет предложен отдельный регистр, например, bХозрасчетный.60.01, bХозрасчетный.62.02. По сути каждый для каждого счета в регистре бухгалтерии определяется свой обособленный регистр с определенным набором измерений субконто.
Движения по регистру записываются с помощью документа Корректировки записи регистров или Документа в параметрах (если задан), алгоритм описан в функции «Таблица в записи регистра».
Предварительно таблицу с остатками можно получить с помощью функции «Таблица из остатков регистра».
Входные поля: Регистр остатков, Дата, Документ (Документ), Замена (Булево), Отбор (Строка).
Таблица в обороты регистра
Записать таблицу в обороты регистра накопления или регистра бухгалтерии. Аналогично функции «Таблица в остатки регистра».
При замене указывается интервал Дата1 и Дата2, за который будут заменяться обороты. На дату Дата будут записаны итоговые движения. Допустимо использовать произвольный отбор.
Предварительно таблицу с оборотами можно получить с помощью функции «Таблица из оборотов регистра».
Входные поля: Регистр остатков/оборотов, Дата, Документ (Документ), Развернуто (Булево), Замена (Булево), Отбор (Строка), Дата1 (Дата), Дата2 (Дата).
Таблица в срез регистра
Записать таблицу в срез регистра сведений. Если регистр сведений подчинен регистратору, то действие аналогично функции «Таблица в остатки регистра».
При замене среза есть особенности. В данном случае нет суммового понятия ресурсов, простое вычитание не подойдет. В случае, если для заменяемой записи нет перекрывающей записи в Таблице с тем же ключом, то запись аннулируется через установку пустых значений ресурсов. Если перекрывающая запись присутствует в Таблице, то она записывается без изменений. Соответственно, после выполнения функции в срезе будут присутствовать все записи Таблицы и аннулированные старые записи (при наличии) с пустыми ресурсами.
Для независимых регистров сведений Таблица (или разница со срезом на Дату) просто записывается в регистр. Для периодических регистров сведений можно указать параметр Дата для записи всех движений в одну временную точку.
Предварительно таблицу среза можно получить с помощью функции «Таблица из среза регистра».
Входные поля: Регистр сведений, Дата, Документ (Документ), Замена (Булево), Отбор (Строка).
Действия над группой таблиц
Сохранить
Сохранить все таблицы в файл. Если файл не задан, то таблицы сохраняются в кэше.
Надежнее сохранять в файл, но для промежуточных вычислений вполне подойдет.
Входные поля: Файл.
Восстановить
Восстановить все таблицы из файла. Если файл не задан, то таблицы загружаются из кэша.
Входные поля: Файл.
Сравнить
Сравнить 2 выбранные таблицы. Сравнение встроенным алгоритмом сравнения текстов или авторским алгоритмом «по ячейкам» в зависимости от параметра Способ.
В платформе заложен удобный функционал сравнения текстов. Цветом выделяются добавленные, измененные и удаленные строки двух текстов в диалоговом окне. При сравнении встроенным алгоритмом таблицы преобразуются в текст, затем запускается функция сравнения текстов. В данном случае таблицы будут идентичны, если их текстовое представление одинаково.
Авторский алгоритмом сравнения таблиц «по ячейкам» (внутренний алгоритм) анализирует изменения ячеек по значениям. Алгоритм определяет перемещенные строки таблиц. Результатом будет текстовый отчет о различиях таблиц.
Входные поля: Способ (Сравнение текста 1С, Внутренний алгоритм).
Добавить Таблицу по формуле
Добавить таблицу по формуле из выбранных таблиц. Допускается использовать операции +, - и * / на коэффициент. Таблицы задаются идентификаторами.
В списке таблиц есть колонка Идентификатор, в которой формируется уникальный идентификатор для каждой таблицы. Идентификатор не может начинаться с цифры, не содержит пробельных символов, не может быть пустым. Идентификатор состоит только из русских и английских букв, цифр и символа «_». Это стандартные требования к идентификаторам и именам переменных в программировании.
Пример формулы: Т1*2-T2
Входные поля: Формула (Строка).
Загрузить
Загрузить все таблицы из файла Excel. Процессор сканирует все листы, распознает таблицы по рамкам и добавляет все найденные таблицы в список таблиц. Для каждой таблицы генерируется уникальные наименование и идентификатор.
В Excel таблицах данные в ячейках имеют тип (Строка, число, дата). При загрузке Процессор по умолчанию определяет тип значений для каждой колонки. Колонки могут быть сложного типа, например «Строка,Число» (значит в колонке присутствуют строки и числа).
Входные поля: Файл, Определить типы значений (булево).
Дополнительно
Описание встроенного языка формул
Описано в статье //infostart.ru/1c/articles/1343680/.
Описание видов
Примитивные виды:
ч Число
с Строка
д Дата
б Логический (Истина/Ложь)
н Неопределено
N Null
Ссылочные виды:
С{Вид} Справочник
Д{Вид} Документ
п{Вид} Перечисление
П{Вид} Счет из плана счетов
В{Вид} План видов характеристик
З{Вид} Задача
Б{Вид} Бизнес-процесс
Регистры
s{Вид} Регистр сведений
n{Вид} Регистр накопления
b{Вид} Регистр бухгалтерии
r{Вид} Регистр расчета
Примитивные виды задаются одной буквой, для остальных видов 1ая буква задает тип (С - Справочник, Д - документ),
последующие буквы задают имя объекта, как оно задано в конфигураторе. Например: СКонтрагенты, ДРеализацияТоваровУслуг.
Сложные виды задаются списком простых видов, разделенных запятой без пробелов, например: с,ч,СКонтрагенты.
Продукт
Разработка «Табличный процессор» поставляется как часть программного продукта «Обработка Командер 1С», описанного в статье автора //infostart.ru/public/682078/, в разделе «Таблицы». В указанной статье представлена последняя версия обработки, которая включает в себя последнюю версию «Табличного процессора».