Голая правда об 1С
Разработчики 1С рассматривают ее, прежде всего, как коммерческий продукт вне подозрений и в отсутствие на рынке прочих аналогичных продуктов это уже главная проблема 1С и тех, кто ее внедряет. Вместе с тем это становится и проблемой самих разработчиков 1C: рост числа несовместимых на всех уровнях (данные, формы, язык программирования и др.) версий и модификаций 1Cv8.0 - 8.2. Попробуем отойти от такого подхода к 1С и, возможно, помочь в этом авторам 1С.
Содержание |
1. Немного моей истории, начиная с 1Сv7
И попутно о том нужном, чего НЕ было в 1Cv7 и нет в 1Cv8.
При разработке и внедрении Приложений 1Сv7 регистрировал недоработки и ошибки 1С, искал способы их обойти. Когда их число достигло не одну сотню, систематизировал их в рукописи, отрабатывая пользовательские стандарты, делающие недочеты 1С малозаметными для разработчика Приложений.
Стандарты реализовал непосредственно в среде 1Cv7 в виде:
- специальных невидимых полей типа ‘Текст’ в формах объектов (справочников, документов и журналов), идентифицирующих эти формы и их отношение к стандартам
- стандартных процедур, помещаемых разделом в глобальный модуль любого Приложения и управляющих формами объектов и отчетами, с момента их открытие и до закрытия
- фиксированными именами глобальных списков, содержащих метаданные и текущие данные (состояние) основных реквизитов и объектов открытых форм
- параметров настройки (свойства) стандартов Приложения, размещаемых разработчиком Приложения в общих (глобальных) MXL-таблицах с фиксированными именами, причем в виде выражений языка программирования 1С, динамически вычисляемых каждый раз при обращении к пользовательскому стандарту
Сергей Петренко, МТС RED: ИБ-игроки строят экосистемы, чтобы обеспечить заказчика интегрированными средствами защиты
- определяемых разработчиком Приложения малозаметных пометок (символы) в первой позиции комментария к реквизитам объектов
и др.
В итоге модули форм объектов одного типа стали минимальны по размеру и внешне мало отличимы: одни и тек же процедуры с обращением к одним и тем же стандартам и редко отличающиеся только набором входных параметров, передаваемых стандартам.
Среди таких стандартов, используемых куда проще, чем аналогичные встроенные в 1Cv8:
- Автоматическое закрытие форм подчиненных справочников при закрытии формы их владельца
- Сортировка и отбор элементов справочников и документов по значениям нескольких реквизитов одновременно (кортеж значений) с отображением текущей упорядоченности и отбора в формах справочников и журналов
- Ведение подвалов с итогами в формах подчиненных справочников
- Реквизиты типа ‘ДатаВремя’ и ‘Время’, поддержку их нужными стандартными функциями, включая учет поясов времени
- Контроль заполнения реквизитов элементов (строк) справочников и документов
и мн. др.
Вместе с тем аналогичным образом (в среде 1Сv7) введены стандарты, отсутствующие в 1Сv8 и так необходимые в разработке и сопровождении Приложений:
- Определение основных реквизитов (вместо Кода и Наименования) справочника с отображением их в заголовке формы, включая определение владельца в формах подчиненных справочников
- Сохранение при закрытии форм и восстановление при их повторном открытии текущих строк и колонок таблиц в формах справочников, журналов и документов
- При вызове формы списка владельца автоматически восстановление режима подчиненности вызванных ранее автономно форм списков подчиненных ему справочников
- Инициализация (автозаполнение исходными значениями) реквизитов вновь вводимого элемента справочника, документа или его строки, в том числе вычислениями из значений реквизитов владельца, родителя и предыдущего текущего элемента (строки документа)
- Синтаксический контроль значений вводимых реквизитов по описанию их лексической структуры на уровне RegExp (регулярных выражений) языков Perl и Jscript
- Логический контроль значений реквизитов элемента справочника, заголовка и строки документа, включая формирование сообщений об обнаруженных ошибках
- Логический контроль требуемых отношений (параметры – выражения в MXL-таблицах) данных справочника и документа), включая контроль дублей кортежей значений основных реквизитов строки документа; генерация (вычисление) соответствующих сообщений об ошибках
- Централизованное описание средств инициализации и контроля реквизитов выражениями (параметры) в MXL-таблицах для справочников и документов. Для этой цели используется матричная форма `Реквизит – Объект` (MXL-таблица), сокращающая размеры описаний средств контроля и возможность их просмотра по каждому реквизиту в разрезе объектов, где он используется
- Определение цепочек логически связанных реквизитов в элементах справочников, заголовке и строках документов, контроль и автоматизация (перемещение курсора) заполнения реквизитов каждой цепочки в указанном порядке
- Введение пользователем интервалов значений реквизитов, сортировка и отбор документов и элементов справочников по интервалам и значениям нескольких реквизитов одновременно. Допускается введение интервалов дат и количества строк документов
- Поиск и Отбор элементов справочника по ключевым словам с автоматической пополнением и корректировкой тезаурусов при редакции элементов справочников
- Полнофункциональный генератор Отчетов с ведением иерархии групп строк Отчета, генерацией их аголовков и подвалов с итогами, автонумерацией страниц
+и мн. др.
2. Проблемы 1С
Зарегистрированные мною многочисленные разнообразные `проколы ` 1С v7 в основном порождены просчетами в определении исходных концепций, которые собственно отсутствуют (изложение) в любых руководствах по 1С. При относительной простоте 1Cv7 (200-300 примитивов) с этим можно было согласиться (вытерпеть). Однако исходные концепции 1Cv7 фактически перекочевали в 1Cv8, сопрягаемую с современными средами и требованиями сетей персональных компьютеров (Интернет-технологии, базы данных и др.) и потому с на более чем порядок возросшим числом примитивов (объектов, правил, операторов языка и др.) и, соответственно, проблем. Поэтому сосредоточимся лишь на просчетах в концепциях и в качестве примеров на вызванных ими отдельных `проколах`. 1Сv8 (1Cv7)
2.1. 1С – НЕ объектно-ориентированная среда
Несмотря на вводимые определения объектов, событий с ними, обработчиков событий (методов) и даже использование точечной нотации в выражениях языка программирования 1С трудно признать объектно-ориентрованной средой в отсутствие обычных для такой среды следующих решений:
- Минимальный набор объектов и правил, по которым из этого набора конструируется иерархической структуры любой другой объект, включая поле ввода с заголовком, командную панель, таблицу, ее строку и заголовок (шапку), дерево, и даже форму. Согласно такой концепции строка - лишь подобъект таблицы, точнее, ее коллекции строк (также подобъекта объекта 'таблица'), а содерэимое ячейки - подобъекты строки; командная панель – лишь строка , в ячейках которой могут размещаться как данные, так кнопки панели и др. Более того, в ячейке таблицы может располагаться любой объект, например, командная панель или другая таблица. Это означает, что начиная с формы, как объекта наивысшего уровня, посредством точечной нотации и индексирования (явно или посредством методов) элементов (подобъектов) коллекций можно одним выражением добраться до любого подобъекта формы на любом уровне иерархии ее структуры.
- Любое событие связывается с началом и окончанием некоторого действия. В отсутствие четкого определения действий с объектами неудивительно, что в 1С упущен целый ряд событий по началу или окончанию многих действий. Например, в операции перемещения курсора присутствует событие ‘Активизация’ (onFocus), причем далеко не для всех объектов и отсутствует ‘ДеАктивизация’ (Blur – уход с объекта). По той же причине отсутствует понятие ‘Состояние действия’, за исключением перемещения курсора – состояние ‘Текущий’ (объект, элемент) , определяемое некорректно (см. далее)
- Связываемое с объектом событие должно отрабатываться по всей его иерархической структуре. Например, событие ‘Активизация’ (1С) при установке курсора с одной формы на ячейку таблицы другой поочередно должно отрабатываться для объектов: другая форма, ее таблица, строка таблицы и объекта в ячейке строки. При уходе отсюда (blur) в обратном порядке – от нижнего уровня к верхним. В соответствии с этой концепцией в приведенном примере свойство ‘Текущий’ должно появляться у всех объектов на пути (точечная нотация) от формы (корень) до ячейки таблицы. Советую разработчикам 1С заглянуть в объектно-ориентированные среды Paradox7-10
- Единая для всех объектов компактная панель (форма) свойств и событий, позволяющая их просматривать в разрезе различных объектов формы одновременно (анализ). Для этого действия над объектами и связанные с ними события должны быть унифицированы по видам (классам) объектов, например, рассмотренные выше onFocus (Активизация) и Blur, нажатие и отпуск кнопки Мышки, любой клавиши и др.
- Понятия ‘ приоритет’, ’ область лействия’ и ‘пакеты’ событий. В их отсуствие в 1С , например, проблемой является попытка перехватить событие ‘Нажатие клавиши Esc’ для блокирования отмены редакции (другое действие и событие)
- Унифицированный механизм программной имитации событий c любыми объектами
- Средства конструирования пользователем собственных видов (классов) объектов
- Экранная форма является средством эффективного интерактивного управления базой данных, причем не только с точки зрения удобств пользователя, но и по быстродействию. Так еще Paradox 4.5 доступ к данному по ссылке в форме выполнял значительно быстрее, чем поиск оператором LOCATE по тому же ключевому реквизиту. С этой точки зрения важен унифицированный по объектам доступ (например, по свойству ‘Значение’) в форме к значению данного элемента (объекта) формы, описываемого , но НЕ используемого для той же цели 1C8.2 свойством ‘ПутьКданным’. Причем речь идет о доступе к данным текущих подобъектов по всей иерархии структуры объекта: ячейка таблицы (поле ввода) – ссылка на реквизит; строка таблицы – ссылка на элемент справочника или строку документа и др.; таблица – коллекция ссылок на ее строки, отображаемые в форме и т.д.
2.2. Низкий уровень унификации решений 1С
1) Собственно, сформулированные выше (п.2.1) концепции объектно-ориентированной среды уже предполагают унификацию, делающую 1С8 обозримой и понятной, на порядок сократив количество примитивов 1С8, и, соответственно, содержание Синтаксис-помощника и самих Приложений в среде 1C8, как и число модификаций 1C8. С этой точки зрения трудно понять, почему:
- Заголовок поля ввода, таблицы и формы являются в 1Сv8 свойствами, а НЕ подобъектами, соответственно, поля ввода, таблицы и формы, имеющими в случае таблицы внутреннюю структуру (коллекцию подобъектов) и в любом случае собственные унифицированные по объектам и подобъектам свойства (Цвет, Фон, Шрифт, Размеры, ПутьКданным и др.) и события
- Таблица формы (форма списка справочника и др.) не содержит подобъект из коллекции строк – также подобъектов и невозможно перебрать программно эти строки и добраться до содержимого ячейки любой строки одним выражением, начиная от объекта ‘ЭтаФорма’ даже НЕ используя при этом подобъекта или свойства (??) ‘Элементы’ формы
- При наличии реквизитов формы нельзя надписи и заголовки объектов задавать выражениями, включающими текущие значения этих реквизитов, как и прочих полей формы, с тем чтобы избежать программирования этих объектов и т.д. и т.п.
Вместо этого для формы и таблицы вводят массу свойств, каждое их которых трудно найти в списке свойств (панель) и невозможно запомнить.
2) Элементы конфигурации в части данных (справочники, документы и др.) также НЕ определяются в рамках концепций объектно-ориентированной среды. Потому игнорируется возможность операции с объектами данных выстроить аналогично операциям с объектами форм, например:
- Объект конфигурации - справочник, документ, регистр и др. определить как коллекцию Ссылок на их элементы, строки (подобъекты). При этом перебор ссылок в коллекции осуществлять обычным для нее циклом `Для каждого`, освободившись от неопределенного физически типа `СправочникВыборка` и заодно от метода `Следующий()
- Доступ к Ссылкам объектов (членам коллекции) осуществлять выражением
<Тип Объекта>.<Идентификатор>[<Индексы>], (А)
где индексы задаются списком (через запятую) выражений – вычисляемых значений основных (ключевых) реквизитов объекта, необязательно включающим владельца и родителя, или структурой `Отбор` 1Сv8. Результатом выражения (А) является коллекция Ссылок на элементы объекта, отвечающие Индексам. В этом случае отпадает необходимость в специальных ограниченных (содержание) методах поиска элементов (Ссылок на них)
- Обычным для объектно-ориентированного программирования способом справа в (А) через `.` (точку) допустить обращение по идентификатору к реквизиту элемента (коллекция реквизитов), указываемой первой (Справочник) или последней (Регистр сведений) Ссылкой коллекции – результата (А)
- Естественно допустить применение цикла `Для каждого` и обычное индексирование (индексы 0, 1, 2,…) для полученной выражением (А) коллекции, как обычной
- Использовать точечную нотацию и для определения типов, например для справочника:
Справочник, `Справочник.Товары` и `Справочник.Товары.Ссылка,
убрав массу определений типа `Справочники, `СправочникВыборка, `СправочникСсылка.
3) Далее по отдельным решениям основных объектов конфигурации:
- Еще в 1Сv7 `Числовой` тип ‘Кода’ элемента справочника был условным: В целом ряде операций он используется как тип ‘Строка’. Вряд ли оправдано введение специальных реквизитов `Код` и `Наименование` в элементе справочника со специальными средствами управления справочниками: на практике в качестве основных определяющих элемент справочника приходится использовать кортеж из других (обычно одиого - двух) реквизитов. Впрочем, реквизит типа ‘Счетчик’ (сейчас только ‘Код’ в 1С ), да еще с шагом более 1, также НЕ исключается, в том числе и как основной по требованию (конфигурация) разработчика Приложения 1С
- В отсутствие специальных реквизитов `Код` и `Наименование` сомнительна и необходимость в табличной части справочника и документа. Эти объекты можно было бы объединить с определением типа `подчиненные справочники`, тем более, что в сегодняшних табличных частях элемента справочника, как и документа, также на практике существуют определяющие строку реквизиты (ключи). В этом случае аналогично ‘Коду’ элемента справочника можно было бы исключить обязательное наличие специального реквизита ‘НомерСтроки’, вводя их как основной типа ‘Счетчик’
- С учетом выше можно было журнал – список документов одного типа определить как справочник заголовков документов типа, дав возможность пользователю теми же средствами самому определять основные (идентифицирующие) реквизиты Документа, включая Дату (Время) и Номер документа (возможно, как реквизит типа ‘Счетчик’). В этом случае удалось бы объединить (унифицировать) многие средства управления справочникоми и документами
- Все универсальные типы коллекций, включая массивы и структуры, можно свести к одному - `Дереву значений`, содержательно объединяющему все прочие и теперь с едиными средствами управления. Определив часть реквизитов как ключевые (свойство вида Boolean), распространить индексирование многомерных массивов на индексирование дерева значений вглубь по уровням иерархии: очередной индекс определяет номер элемента коллекции (свойства Строки) владельца ддя очередного уровня иерархии. Впрочем, тогда бы пришлось поработать и над унификацией элементов, свойств и методов самого Дерева значений 1С, также далеких от требуемого уровня унификации
4) Предлагаемая 1С структура Приложения в виде бизнес-процессов и задач недостаточна, ибо здесь фактически отсутствует визуально обозримая в конфигурации
логическая структура Приложения из этапов (возможно, для каждого вида пользователя отдельно!), в которой:
- Определяются начальные этапы, допустимые переходы из одного этапа в другие и, возможно, условия перехода
- Для каждого этапа отдельно определяется Рабочая область (модель стола) с собственными главным меню, командной панелью, руководством, пачкой автоматически открываемых при запуске этапа форм объектов (журналов, документов, справочников и др.)
- При первом запуске этапа формы пачки создаются и располагаются на рабочем столе по заданным для этапа параметрам: исходные размеры и порядок размещения в пачке (одиа под другой), исходные данные для определения содержимого форм
- Предусматривается возможность возврата из очередного этапа к его вызвавшему этапу. В этом случае для возвращаемого этапа автоматически Рабочая область вместе с пачкой форм объектов на ней восстанавливается по состоянию на момент вызова этим этапом очередного этапа, включая порядок, размеры, текущие элементы (строки , ячейки таблиц и др.) в формах пачки. Возможность приведения Рабочей области в состояние, исходное при первом запуске этапа (параметры настройки)
- Автоматически в соответствующем системном журнале регистрируются данные начала и завершения этапов, включая дату и время
Такое решение существенно сокращает затраты пользователя на управление (диалог) Приложением, сократив число и размеры многочисленных меню и закладок в формах, а также затраты на их открытие и закрытие, приведение в нужное состояние.
В заключение предлагаю разработчикам 1С решить извечный для нас вопрос: Что важнее – честь мундира, деньги или истина!