Почему не 1С?



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

    Так сложилось, что на хабре многие 1С не любят, но порой складывается впечатление, что немногие из этих людей хорошо понимают, за что они его не любят. Этой статьей мы восполним этот пробел и убьем сразу двух зайцев: с одной стороны, расскажем, как в 1С все устроено изнутри, а с другой стороны — почему это все работает не так как нужно / хотелось бы. Надо сказать, что 1С многими своими решениями смог реально нас удивить, впрочем, не будем забегать вперед.

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

    Итак, поехали. Проблем в 1С достаточно много, поэтому, чтобы в них удобнее было ориентироваться, начнем с оглавления (со списком всех этих проблем):


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

    Объекты: Справочники, Документы и т.д.


    Как обычно устроены ORM фреймворки / платформы? В языке разработки ORM фреймворка в том или ином виде поддерживаются классы объектов. Для каждого из этих классов разработчик может задать его отображение на некоторую таблицу. Как правило, один класс соответствует одной таблице, единственный ключ которой, в свою очередь, соответствует идентификатору объекта этого класса. Тут, конечно, возникает вопрос, что делать с таблицами у которых несколько ключей. Для них тоже создаются соответствующие классы, благо большинство ORM поддерживают в качестве идентификаторов несколько полей одного класса. Порой, конечно, при таком отображении получаются достаточно дырявые абстракции вроде ТоварНаСкладе, но зато работа с данными в большинстве случаев идет в одной парадигме (ООП).

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

    • Отображением на таблицы разработчик никак не управляет, и вообще оно скрыто от него (хотя ничего особенного в нем нет)
    • Никаких one-to-many, many-to-many отображений нет, их функцию выполняют так называемые табличные части — коллекции внутренних объектов, фактически агрегированных в основной объект.

    Неэффективное получение данных объектов


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

    • либо слишком много — если надо получить только одно поле (реквизит)
    • либо слишком мало — если в цикле надо обращаться к другим объектам по ссылке, мы получаем классическую проблему N+1 (один запрос для получения N объектов и по одному запросу для каждой ссылки).

    Такая убогость механизма ORM в 1С на самом деле обусловлена тем, что в 1С в какой-то момент попросту решили отказаться от ORM и сделать ставку на голый SQL (то есть регистры и запросы). Правда, немного забегая вперед, с учетом отсутствия расширенных возможностей SQL и DML в 1С периодически все-таки возвращаются к ORM, но это скорее вынужденная необходимость. А в целом типичный код типовых решений на 1С выглядит приблизительно так:

    Пример кода
    Процедура ИнициализироватьДанныеДокумента(ДокументСсылка, ДополнительныеСвойства, Регистры = Неопределено) Экспорт
    
    	////////////////////////////////////////////////////////////////////////////
    	// Создадим запрос инициализации движений
    	
    	Запрос = Новый Запрос;
    	ЗаполнитьПараметрыИнициализации(Запрос, ДокументСсылка);
    	
    	////////////////////////////////////////////////////////////////////////////
    	// Сформируем текст запроса
    	
    	ТекстыЗапроса = Новый СписокЗначений;
    	ТекстЗапросаТаблицаЗаказыКлиентов(Запрос, ТекстыЗапроса, Регистры);
    	ТекстЗапросаТаблицаСвободныеОстатки(Запрос, ТекстыЗапроса, Регистры);
    	ТекстЗапросаТаблицаОбеспечениеЗаказов(Запрос, ТекстыЗапроса, Регистры);
    	ТекстЗапросаТаблицаТоварыКОтгрузке(Запрос, ТекстыЗапроса, Регистры);
    	ТекстЗапросаТаблицаТоварыНаСкладах(Запрос, ТекстыЗапроса, Регистры);
    	ТекстЗапросаТаблицаДвиженияСерийТоваров(Запрос, ТекстыЗапроса, Регистры);
    	ТекстЗапросаТаблицаПереданнаяВозвратнаяТара(Запрос, ТекстыЗапроса, Регистры);
    	ТекстЗапросаТаблицаТоварыОрганизаций(Запрос, ТекстыЗапроса, Регистры);
    	ТекстЗапросаТаблицаТоварыПереданныеНаКомиссию(Запрос, ТекстыЗапроса, Регистры);
    	ТекстЗапросаТаблицаДатыПередачиТоваровНаКомиссию(Запрос, ТекстыЗапроса, Регистры);
    	ТекстЗапросаТаблицаТоварыОрганизацийКПередаче(Запрос, ТекстыЗапроса, Регистры);
    	ТекстЗапросаТаблицаТоварыКОформлениюОтчетовКомитенту(Запрос, ТекстыЗапроса, Регистры);
    	ТекстЗапросаТаблицаСебестоимостьТоваров(Запрос, ТекстыЗапроса, Регистры);
    	ТекстЗапросаТаблицаВыручкаИСебестоимостьПродаж(Запрос, ТекстыЗапроса, Регистры);
    	ТекстЗапросаТаблицаРасчетыСКлиентами(Запрос, ТекстыЗапроса, Регистры);
    	ТекстЗапросаТаблицаСуммыДокументовВВалютеРегл(Запрос, ТекстыЗапроса, Регистры);
    	ТекстЗапросаТаблицаНДССостояниеРеализации0(Запрос, ТекстыЗапроса, Регистры);
    	ТекстЗапросаТаблицаНДСЗаписиКнигиПродаж(Запрос, ТекстыЗапроса, Регистры);
    	ТекстЗапросаТаблицаМатериалыИРаботыВПроизводстве(Запрос, ТекстыЗапроса, Регистры);
    	ТекстЗапросаТаблицаДвиженияНоменклатураНоменклатура(Запрос, ТекстыЗапроса, Регистры);
    	ТекстЗапросаТаблицаУслугиКОформлениюОтчетовПринципалу(Запрос, ТекстыЗапроса, Регистры);
    	ТекстЗапросаТаблицаРеестрДокументов(Запрос, ТекстыЗапроса, Регистры);
    	ПроведениеСерверУТ.ИницализироватьТаблицыДляДвижений(Запрос, ТекстыЗапроса, ДополнительныеСвойства.ТаблицыДляДвижений, Истина);
    	
    КонецПроцедуры
    
    Функция ТекстЗапросаТаблицаЗаказыКлиентов(Запрос, ТекстыЗапроса, Регистры)
    	ИмяРегистра = "ЗаказыКлиентов";
    	
    	Если НЕ ПроведениеСерверУТ.ТребуетсяТаблицаДляДвижений(ИмяРегистра, Регистры) Тогда
    		Возврат "";
    	КонецЕсли; 
    	
    	ТекстЗапроса =
    	"ВЫБРАТЬ
    	|	ЗНАЧЕНИЕ(ВидДвиженияНакопления.Расход) КАК ВидДвижения,
    	|	&ДатаРаспоряжения КАК Период,
    	|	ТаблицаТовары.ЗаказКлиента КАК ЗаказКлиента,
    	|	ТаблицаТовары.Номенклатура КАК Номенклатура,
    	|	ТаблицаТовары.Характеристика КАК Характеристика,
    	|	ВЫБОР
    	|		КОГДА ТаблицаТовары.СтатусУказанияСерий В (10, 14)
    	|			ТОГДА ТаблицаТовары.Серия
    	|		ИНАЧЕ ЗНАЧЕНИЕ(Справочник.СерииНоменклатуры.ПустаяСсылка)
    	|	КОНЕЦ КАК Серия,
    	|	ТаблицаТовары.КодСтроки КАК КодСтроки,
    	|	ВЫБОР
    	|		КОГДА ТаблицаТовары.Номенклатура.ТипНоменклатуры В (ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Товар), ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.МногооборотнаяТара))
    	|			ТОГДА ТаблицаТовары.Склад
    	|		ИНАЧЕ ЗНАЧЕНИЕ(Справочник.Склады.ПустаяСсылка)
    	|	КОНЕЦ КАК Склад,
    	|	0 КАК Заказано,
    	|	ТаблицаТовары.Количество КАК КОформлению,
    	|	ТаблицаТовары.СуммаВзаиморасчетов КАК Сумма
    	|ИЗ
    	|	Документ.РеализацияТоваровУслуг.Товары КАК ТаблицаТовары
    	|ГДЕ
    	|	ТаблицаТовары.Ссылка = &Ссылка
    	|	И ТаблицаТовары.КодСтроки <> 0
    	|	И &Статус <> ЗНАЧЕНИЕ(Перечисление.СтатусыРеализацийТоваровУслуг.Отгружено)
    	|	И &РеализацияПоЗаказу
    	|	И &ИспользоватьРасширенныеВозможностиЗаказаКлиента
    	|
    	|ОБЪЕДИНИТЬ ВСЕ
    	|
    	|ВЫБРАТЬ
    	|	ЗНАЧЕНИЕ(ВидДвиженияНакопления.Расход),
    	|	&ДатаРаспоряжения,
    	|	ТаблицаТовары.ЗаказКлиента,
    	|	ТаблицаТовары.Номенклатура,
    	|	ТаблицаТовары.Характеристика,
    	|	ВЫБОР
    	|		КОГДА ТаблицаТовары.СтатусУказанияСерий В (10, 14)
    	|			ТОГДА ТаблицаТовары.Серия
    	|		ИНАЧЕ ЗНАЧЕНИЕ(Справочник.СерииНоменклатуры.ПустаяСсылка)
    	|	КОНЕЦ,
    	|	ТаблицаТовары.КодСтроки,
    	|	ВЫБОР
    	|		КОГДА ТаблицаТовары.Номенклатура.ТипНоменклатуры В (ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Товар), ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.МногооборотнаяТара))
    	|			ТОГДА ТаблицаТовары.Склад
    	|		ИНАЧЕ ЗНАЧЕНИЕ(Справочник.Склады.ПустаяСсылка)
    	|	КОНЕЦ,
    	|	ТаблицаТовары.Количество,
    	|	ТаблицаТовары.Количество,
    	|	ТаблицаТовары.СуммаВзаиморасчетов
    	|ИЗ
    	|	Документ.РеализацияТоваровУслуг.Товары КАК ТаблицаТовары
    	|ГДЕ
    	|	ТаблицаТовары.Ссылка = &Ссылка
    	|	И ТаблицаТовары.КодСтроки <> 0
    	|	И &Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыРеализацийТоваровУслуг.Отгружено)
    	|	И &РеализацияПоЗаказу
    	|	И &ИспользоватьРасширенныеВозможностиЗаказаКлиента
    	|
    	|ОБЪЕДИНИТЬ ВСЕ
    	|
    	|ВЫБРАТЬ
    	|	ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход),
    	|	&ДатаРаспоряжения,
    	|	ТаблицаТовары.ЗаказКлиента,
    	|	ТаблицаТовары.Номенклатура,
    	|	ТаблицаТовары.Характеристика,
    	|	ВЫБОР
    	|		КОГДА ТаблицаТовары.СтатусУказанияСерий В (10, 14)
    	|			ТОГДА ТаблицаТовары.Серия
    	|		ИНАЧЕ ЗНАЧЕНИЕ(Справочник.СерииНоменклатуры.ПустаяСсылка)
    	|	КОНЕЦ,
    	|	ТаблицаТовары.КодСтроки,
    	|	ВЫБОР
    	|		КОГДА ТаблицаТовары.Номенклатура.ТипНоменклатуры В (ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Товар), ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.МногооборотнаяТара))
    	|			ТОГДА ТаблицаТовары.Склад
    	|		ИНАЧЕ ЗНАЧЕНИЕ(Справочник.Склады.ПустаяСсылка)
    	|	КОНЕЦ,
    	|	0,
    	|	ТаблицаТовары.Количество,
    	|	ТаблицаТовары.СуммаВзаиморасчетов
    	|ИЗ
    	|	Документ.РеализацияТоваровУслуг.Товары КАК ТаблицаТовары
    	|ГДЕ
    	|	ТаблицаТовары.Ссылка = &Ссылка
    	|	И ТаблицаТовары.КодСтроки = 0
    	|	И &РеализацияПоЗаказу
    	|	И &ИспользоватьРасширенныеВозможностиЗаказаКлиента
    	|
    	|ОБЪЕДИНИТЬ ВСЕ
    	|
    	|ВЫБРАТЬ
    	|	ЗНАЧЕНИЕ(ВидДвиженияНакопления.Расход),
    	|	&ДатаРаспоряжения,
    	|	ТаблицаТовары.ЗаказКлиента,
    	|	ТаблицаТовары.Номенклатура,
    	|	ТаблицаТовары.Характеристика,
    	|	ВЫБОР
    	|		КОГДА ТаблицаТовары.СтатусУказанияСерий В (10, 14)
    	|			ТОГДА ТаблицаТовары.Серия
    	|		ИНАЧЕ ЗНАЧЕНИЕ(Справочник.СерииНоменклатуры.ПустаяСсылка)
    	|	КОНЕЦ,
    	|	ТаблицаТовары.КодСтроки,
    	|	ВЫБОР
    	|		КОГДА ТаблицаТовары.Номенклатура.ТипНоменклатуры В (ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Товар), ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.МногооборотнаяТара))
    	|			ТОГДА ТаблицаТовары.Склад
    	|		ИНАЧЕ ЗНАЧЕНИЕ(Справочник.Склады.ПустаяСсылка)
    	|	КОНЕЦ,
    	|	0,
    	|	ТаблицаТовары.Количество,
    	|	ТаблицаТовары.СуммаВзаиморасчетов
    	|ИЗ
    	|	Документ.РеализацияТоваровУслуг.Товары КАК ТаблицаТовары
    	|ГДЕ
    	|	ТаблицаТовары.Ссылка = &Ссылка
    	|	И ТаблицаТовары.КодСтроки = 0
    	|	И &РеализацияПоЗаказу
    	|	И &ИспользоватьРасширенныеВозможностиЗаказаКлиента";
    	
    	ТекстыЗапроса.Добавить(ТекстЗапроса, ИмяРегистра);
    	Возврат ТекстЗапроса;
    	
    КонецФункции
    


    Таблицы / Представления: Регистры


    Регистры в 1С это большой комбайн, который выполняет сразу несколько функций:

    • Таблицы (с инфраструктурой группового замещения данных)
    • Представления (в том числе материализованные)
    • Работа с моментами / периодами времени (как в таблицах, так и в представлениях)

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

    Функционал работы со временем — это особенность ERP-платформ и 1С в частности. Так, с точки зрения SQL (да и других ЯП), например, дата — это один из примитивных типов, не сильно отличающийся от строки или числа. В 1С же работа со временем поддерживается в большом количестве различных абстракций, например, в документах, таблицах периодических регистров и регистров накоплений. Но во всех этих абстракциях поддержка времени — не более чем дополнительные поля. Существенно интереснее поддержка времени в представлениях (которые в 1С называются виртуальными таблицами).

    Одновременно с созданием регистра в 1С неявно создаются различные представления в зависимости от типа регистра:

    • СрезПоследних (для периодических регистров сведений) — получает последнее значения на дату (в том числе текущую)
    • Остатки, Обороты, ОстаткиИОбороты (для регистров накопления) — получают различные суммы на дату (в том числе текущую)

    Являясь по сути не более чем представлениями в SQL, усовершенствованными для работы со временем, представления в 1С наследуют (а иногда даже и усугубляют) все проблемы представлений в SQL.

    Регистры поддерживаются в очень частных случаях


    Фактически, регистры в 1С поддерживают всего две операции: сумма и последнее по дате, сгруппированные по ключам таблицы. Это на порядок меньше, чем даже индексированные представления в том же MS SQL, не говоря уже про Oracle. Соответственно, шаг влево, шаг вправо — и разработчику необходимо самому создавать таблицу (непериодический регистр сведений / справочник) или поле (реквизит) и вручную поддерживать актуальность данных в них.

    Если же говорить про представления вообще (а не только материализованные), то при сравнении с SQL все еще хуже: аналога этого механизма в 1С нет в принципе, соответственно, для повторного использования / декомпозиции нужно либо создавать процедуры, возвращающие / заполняющие временные таблицы, либо производить различные манипуляции с текстами запросов (вроде склейки или замены).

    Отсутствие ограничений и событий для значений регистров


    Но даже если для расчета некоторого показателя вам удастся обойтись существующими в 1С регистрами, у вас в дальнейшем скорее всего возникнет вопрос, как создать ограничения или события на этот рассчитанный показатель. Например, запретить ситуацию, когда количество к отгрузке становится меньше 0, или послать какое-нибудь уведомление в этом случае. И если в SQL это можно декларативно сделать хотя бы для материализованных представлений, то в 1С даже такой возможности нет. Как это обходится? Разработчики типовых, например, используют такой трюк:

    В триггере ПередЗаписью (в SQL соответствует per-statement trigger on before) запоминают во временную таблицу старые записи регистра для сгенерировавшего его документа:

    Код
    // Текущее состояние набора помещается во временную таблицу,
    	// чтобы при записи получить изменение нового набора относительно текущего.
    	Запрос = Новый Запрос;
    	Запрос.УстановитьПараметр("Регистратор", Отбор.Регистратор.Значение);
    	Запрос.МенеджерВременныхТаблиц = ДополнительныеСвойства.ДляПроведения.СтруктураВременныеТаблицы.МенеджерВременныхТаблиц;
    	Запрос.Текст =
    	"ВЫБРАТЬ
    	|	Таблица.ВидДвижения      КАК ВидДвижения,
    	|	Таблица.ДокументОтгрузки КАК ДокументОтгрузки,
    	|	Таблица.Номенклатура     КАК Номенклатура,
    	|	Таблица.Характеристика   КАК Характеристика,
    	|	Таблица.Назначение       КАК Назначение,
    	|	Таблица.Серия            КАК Серия,
    	|	Таблица.Склад            КАК Склад,
    	|	Таблица.Получатель       КАК Получатель,
    	|	ВЫБОР
    	|		КОГДА Таблица.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)
    	|			ТОГДА Таблица.ВРезерве + Таблица.КОтгрузке
    	|		ИНАЧЕ -Таблица.ВРезерве - Таблица.КОтгрузке
    	|	КОНЕЦ                    КАК ВРезервеКОтгрузкеПередЗаписью,
    	|	ВЫБОР
    	|		КОГДА Таблица.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)
    	|			ТОГДА Таблица.КОтгрузке
    	|		ИНАЧЕ -Таблица.КОтгрузке
    	|	КОНЕЦ                    КАК КОтгрузкеПередЗаписью,
    	|	ВЫБОР
    	|		КОГДА Таблица.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)
    	|			ТОГДА -Таблица.Собирается
    	|		ИНАЧЕ Таблица.Собирается
    	|	КОНЕЦ                    КАК СобираетсяПередЗаписью,
    	|	ВЫБОР
    	|		КОГДА Таблица.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)
    	|			ТОГДА -Таблица.Собрано
    	|		ИНАЧЕ Таблица.Собрано
    	|	КОНЕЦ                    КАК СобраноПередЗаписью
    	|ПОМЕСТИТЬ ДвиженияТоварыКОтгрузкеПередЗаписью
    	|ИЗ
    	|	РегистрНакопления.ТоварыКОтгрузке КАК Таблица
    	|ГДЕ
    	|	Таблица.Регистратор = &Регистратор";
    	Запрос.Выполнить();
    


    В триггере ПослеЗаписи (on after) запоминают во временную таблицу новые + старые записи:

    Код
    СтруктураВременныеТаблицы = ДополнительныеСвойства.ДляПроведения.СтруктураВременныеТаблицы;
    		
    		Запрос = Новый Запрос;
    		ОформлятьСначалаНакладные = Константы.ПорядокОформленияНакладныхРасходныхОрдеров.Получить() = Перечисления.ПорядокОформленияНакладныхРасходныхОрдеров.СначалаНакладные;
    		Запрос.УстановитьПараметр("ОформлятьСначалаНакладные", ОформлятьСначалаНакладные);
    		Запрос.УстановитьПараметр("Регистратор", Отбор.Регистратор.Значение);
    		Запрос.МенеджерВременныхТаблиц = СтруктураВременныеТаблицы.МенеджерВременныхТаблиц;
    		
    		// Рассчитывается изменение нового набора относительно текущего с учетом накопленных изменений
    		// и помещается во временную таблицу.
    		
    		Запрос.Текст =
    		"ВЫБРАТЬ
    		|	ТаблицаИзменений.ДокументОтгрузки           КАК ДокументОтгрузки,
    		|	ТаблицаИзменений.Номенклатура               КАК Номенклатура,
    		|	ТаблицаИзменений.Характеристика             КАК Характеристика,
    		|	ТаблицаИзменений.Назначение                 КАК Назначение,
    		|	ТаблицаИзменений.Серия                      КАК Серия,
    		|	ТаблицаИзменений.Склад                      КАК Склад,
    		|	ТаблицаИзменений.Получатель                 КАК Получатель,
    		|	СУММА(ТаблицаИзменений.КОтгрузкеИзменение)  КАК КОтгрузкеИзменение,
    		|	СУММА(ТаблицаИзменений.СобираетсяИзменение) КАК СобираетсяИзменение,
    		|	СУММА(ТаблицаИзменений.СобираетсяИзменение) КАК СобраноИзменение
    		|ПОМЕСТИТЬ ДвиженияТоварыКОтгрузкеИзменение
    		|ИЗ
    		|	(ВЫБРАТЬ
    		|		Таблица.ВидДвижения            КАК ВидДвижения,
    		|		Таблица.ДокументОтгрузки       КАК ДокументОтгрузки,
    		|		Таблица.Номенклатура           КАК Номенклатура,
    		|		Таблица.Характеристика         КАК Характеристика,
    		|		Таблица.Назначение             КАК Назначение,
    		|		Таблица.Серия                  КАК Серия,
    		|		Таблица.Склад                  КАК Склад,
    		|		Таблица.Получатель             КАК Получатель,
    		|		Таблица.КОтгрузкеПередЗаписью  КАК КОтгрузкеИзменение,
    		|		Таблица.СобираетсяПередЗаписью КАК СобираетсяИзменение,
    		|		Таблица.СобраноПередЗаписью    КАК СобраноИзменение
    		|	ИЗ
    		|		ДвиженияТоварыКОтгрузкеПередЗаписью КАК Таблица
    		|	
    		|	ОБЪЕДИНИТЬ ВСЕ
    		|	
    		|	ВЫБРАТЬ
    		|		Таблица.ВидДвижения,
    		|		Таблица.ДокументОтгрузки,
    		|		Таблица.Номенклатура,
    		|		Таблица.Характеристика,
    		|		Таблица.Назначение,
    		|		Таблица.Серия,
    		|		Таблица.Склад,
    		|		Таблица.Получатель,
    		|		ВЫБОР
    		|			КОГДА Таблица.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)
    		|				ТОГДА -Таблица.КОтгрузке
    		|			ИНАЧЕ Таблица.КОтгрузке
    		|		КОНЕЦ,
    		|		ВЫБОР
    		|			КОГДА Таблица.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)
    		|				ТОГДА Таблица.Собирается
    		|			ИНАЧЕ -Таблица.Собирается
    		|		КОНЕЦ,
    		|		ВЫБОР
    		|			КОГДА Таблица.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)
    		|				ТОГДА Таблица.Собрано
    		|			ИНАЧЕ -Таблица.Собрано
    		|		КОНЕЦ
    		|	ИЗ
    		|		РегистрНакопления.ТоварыКОтгрузке КАК Таблица
    		|	ГДЕ
    		|		Таблица.Регистратор = &Регистратор) КАК ТаблицаИзменений
    		|
    		|СГРУППИРОВАТЬ ПО
    		|	ТаблицаИзменений.ВидДвижения,
    		|	ТаблицаИзменений.ДокументОтгрузки,
    		|	ТаблицаИзменений.Номенклатура,
    		|	ТаблицаИзменений.Характеристика,
    		|	ТаблицаИзменений.Назначение,
    		|	ТаблицаИзменений.Серия,
    		|	ТаблицаИзменений.Склад,
    		|	ТаблицаИзменений.Получатель
    		|
    		|ИМЕЮЩИЕ
    		|	(СУММА(ТаблицаИзменений.КОтгрузкеИзменение) > 0
    		|		ИЛИ СУММА(ТаблицаИзменений.СобираетсяИзменение) > 0
    		|		ИЛИ СУММА(ТаблицаИзменений.СобраноИзменение) > 0)
    		|;
    		|
    		|////////////////////////////////////////////////////////////////////////////////
    		|ВЫБРАТЬ
    		|	Т.Номенклатура             КАК Номенклатура,
    		|	Т.Характеристика           КАК Характеристика,
    		|	Т.Назначение               КАК Назначение,
    		|	Т.Серия                    КАК Серия,
    		|	Т.Склад                    КАК Склад,
    		|	Т.Склад                    КАК Получатель,
    		|	СУММА(Т.УвеличениеПрихода) КАК УвеличениеПрихода
    		|ПОМЕСТИТЬ ДвиженияТоварыКОтгрузкеИзменениеСводно
    		|ИЗ
    		|	(ВЫБРАТЬ
    		|		Таблица.ВидДвижения    КАК ВидДвижения,
    		|		Таблица.Номенклатура   КАК Номенклатура,
    		|		Таблица.Характеристика КАК Характеристика,
    		|		Таблица.Назначение     КАК Назначение,
    		|		Таблица.Серия          КАК Серия,
    		|		Таблица.Склад          КАК Склад,
    		|		Таблица.Склад          КАК Получатель,
    		|		-Таблица.ВРезервеКОтгрузкеПередЗаписью КАК УвеличениеПрихода
    		|	ИЗ
    		|		ДвиженияТоварыКОтгрузкеПередЗаписью КАК Таблица
    		|ГДЕ
    		|	Таблица.Серия <> ЗНАЧЕНИЕ(Справочник.СерииНоменклатуры.ПустаяСсылка)
    		|   И Таблица.Склад.КонтролироватьОперативныеОстатки
    		|	
    		|	ОБЪЕДИНИТЬ ВСЕ
    		|	
    		|	ВЫБРАТЬ
    		|		Таблица.ВидДвижения,
    		|		Таблица.Номенклатура,
    		|		Таблица.Характеристика,
    		|		Таблица.Назначение,
    		|		Таблица.Серия,
    		|		Таблица.Склад,
    		|		Таблица.Получатель,
    		|		ВЫБОР
    		|			КОГДА Таблица.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)
    		|				ТОГДА Таблица.ВРезерве + Таблица.КОтгрузке
    		|			ИНАЧЕ -Таблица.ВРезерве - Таблица.КОтгрузке
    		|		КОНЕЦ
    		|	ИЗ
    		|		РегистрНакопления.ТоварыКОтгрузке КАК Таблица
    		|	ГДЕ
    		|		Таблица.Регистратор = &Регистратор) КАК Т
    		|ГДЕ
    		|	Т.Серия <> ЗНАЧЕНИЕ(Справочник.СерииНоменклатуры.ПустаяСсылка)
    		|   И Т.Склад.КонтролироватьОперативныеОстатки
    		|
    		|СГРУППИРОВАТЬ ПО
    		|	Т.ВидДвижения,
    		|	Т.Номенклатура,
    		|	Т.Склад,
    		|	Т.Получатель,
    		|	Т.Характеристика,
    		|	Т.Назначение,
    		|	Т.Серия
    		|
    		|ИМЕЮЩИЕ
    		|	СУММА(Т.УвеличениеПрихода) > 0
    		|;
    		|
    		|////////////////////////////////////////////////////////////////////////////////
    		|УНИЧТОЖИТЬ ДвиженияТоварыКОтгрузкеПередЗаписью";
    		
    		ЗапросПакет = Запрос.ВыполнитьПакет();
    		Выборка = ЗапросПакет[0].Выбрать();
    		Выборка.Следующий();
    		// Новые изменения были помещены во временную таблицу.
    		// Добавляется информация о ее существовании и наличии в ней записей об изменении.
    		СтруктураВременныеТаблицы.Вставить("ДвиженияТоварыКОтгрузкеИзменение", Выборка.Количество > 0);
    		
    		Выборка = ЗапросПакет[1].Выбрать();
    		Выборка.Следующий();
    		СтруктураВременныеТаблицы.Вставить("ДвиженияТоварыКОтгрузкеИзменениеСводно", Выборка.Количество > 0);
    


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

    Код
    Если ЕстьИзмененияВТаблице(ДанныеТаблиц,"ДвиженияТоварыКОтгрузкеИзменениеСводно") Тогда
    
    		МассивКонтролей.Добавить(Врег("ДвиженияТоварыКОтгрузкеСводно"));
    
    		ТекстЗапроса = ТекстЗапроса + 
    		"
    		|ВЫБРАТЬ
    		|	Остатки.Номенклатура      КАК Номенклатура,
    		|	Остатки.Номенклатура.ЕдиницаИзмерения  КАК ЕдиницаИзмерения,
    		|	Остатки.Характеристика    КАК Характеристика,
    		|	Остатки.Назначение    	  КАК Назначение,
    		|	Остатки.Склад             КАК Склад,
    		|	Остатки.Серия             КАК Серия,
    		|	СУММА(Остатки.Количество) КАК Количество
    		|
    		|ИЗ 
    		|(ВЫБРАТЬ
    		|	Т.Номенклатура       КАК Номенклатура,
    		|	Т.Характеристика     КАК Характеристика,
    		|	Т.Назначение     	 КАК Назначение,
    		|	Т.Склад              КАК Склад,
    		|	Т.Серия              КАК Серия,
    		|	-Т.ВРезервеОстаток - Т.КОтгрузкеОстаток КАК Количество
    		|ИЗ
    		|	РегистрНакопления.ТоварыКОтгрузке.Остатки(
    		|			,
    		|			(Номенклатура, Характеристика, Назначение, Склад, Серия) В
    		|				(ВЫБРАТЬ
    		|					Т.Номенклатура,
    		|					Т.Характеристика,
    		|					Т.Назначение,
    		|					Т.Склад,
    		|					Т.Серия
    		|				ИЗ
    		|					ДвиженияТоварыКОтгрузкеИзменениеСводно КАК Т)) КАК Т
    		|ОБЪЕДИНИТЬ ВСЕ
    		|
    		|ВЫБРАТЬ
    		|	Т.Номенклатура    КАК Номенклатура,
    		|	Т.Характеристика  КАК Характеристика,
    		|	Т.Назначение	  КАК Назначение,
    		|	Т.Склад           КАК Склад,
    		|	Т.Серия           КАК Серия,
    		|	Т.ВНаличииОстаток КАК Количество
    		|ИЗ
    		|	РегистрНакопления.ТоварыНаСкладах.Остатки(
    		|			,
    		|			(Номенклатура, Характеристика, Назначение, Склад, Серия) В
    		|				(ВЫБРАТЬ
    		|					Т.Номенклатура,
    		|					Т.Характеристика,
    		|					Т.Назначение,
    		|					Т.Склад,
    		|					Т.Серия
    		|				ИЗ
    		|					ДвиженияТоварыКОтгрузкеИзменениеСводно КАК Т)) КАК Т
    		|) КАК Остатки
    		|
    		|СГРУППИРОВАТЬ ПО
    		|	Остатки.Номенклатура,
    		|	Остатки.Характеристика,
    		|	Остатки.Назначение,
    		|	Остатки.Склад,
    		|	Остатки.Серия
    		|
    		|ИМЕЮЩИЕ
    		|	СУММА(Остатки.Количество) < 0	
    		|;
    		|///////////////////////////////////////////////////////////////////
    		|";
    	КонецЕсли;
    


    PS: Проверено, эти временные таблицы нигде больше не используются, только для проверки одного простого ограничения.

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

    В параметрах виртуальных таблиц можно использовать только константы


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

        Запрос = Новый Запрос;
        Запрос.Текст = 
            "ВЫБРАТЬ
    		|	Товар.МояДата КАК МояДата,
    		|	Товар.Цена КАК Цена,
    		|	ДвиженияОстатков.ЧислоОстаток КАК Число
    		|ИЗ
    		|	Справочник.Товар КАК Тов
    		|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ДвиженияОстатков.Остатки(Товар.МояДата, Товар = Тов.Ссылка) КАК ДвиженияОстатков
    		|		ПО ДвиженияОстатков.Товар = Тов.Ссылка
    		|		ГДЕ Товар.Наименование = &Имя "
    		;
        РезультатЗапроса = Запрос.Выполнить();
    

    То получите сразу 2 ошибки: “Неверные параметры” и “Таблица Тов не найдена”. И если со второй ошибкой еще как-то можно справиться при помощи конструкции IN (В) и подзапроса (это тоже одна из проблем 1С, но о ней позже), то что делать, когда дата не является константой, а лежит, например, в поле другой таблицы, — непонятно. В SQL для хотя бы частичного решения этой проблемы есть специальный вид JOIN — LATERAL JOIN или APPLY, в 1С же даже этого нет. И, соответственно, нужно самому находить все возможные разновидности дат, хранящихся в заданном поле, после чего для каждой даты выполнять отдельный запрос. Ну или находить минимум / максимум дат и высчитывать остатки и обороты. В любом случае оба этих способа как неудобны, так и не производительны одновременно.

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

    Запросы


    Запросы в 1С пишутся на своем внутреннем диалекте SQL, который по большому счету мало чем отличается от самого SQL. Правда, в отличие от последнего и других платформ, использующих SQL, работа с запросами в 1С осталась на очень примитивном уровне, и соответственно имеет ряд недостатков.

    Запросы в строках


    Запросы по старинке пишутся в строках (смотри примеры выше). Это создает как минимум две проблемы:

    • Со стороны IDE непонятно, как поддерживать автоподстановку, подсветку ошибок, синтаксиса, поиск использований и т.п.
    • Ошибки в запросах обнаруживаются только при выполнении, а не сохранении, запуске или компиляции.

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

    Отсутствие оптимизатора запросов


    Существующий механизм запросов в 1С — это не более чем транслятор SQL-диалекта 1С в синтаксис РСУБД, используемой системой в качестве хранилища данных. И вот тут есть тонкий момент. Дело в том, что кроме больших коммерческих СУБД с кучей оптимизаторов (MS SQL, Oracle), 1С также поддерживает свою файловую СУБД и PostgreSQL, которые работают по принципу «что вижу, то и выполняю». В частности, как было отмечено в предыдущей статье, PostgreSQL не поддерживает Join Predicate Push Down (возможность проталкивания условия запроса внутрь подзапроса). Соответственно у 1С разработчика при написании любого запроса возникает дилемма, можно ли полагаться на оптимизаторы СУБД или нет.

    Общая рекомендация самой 1С — нет (и это понятно, так как в противном случае потребовалась бы установка дорогостоящих и громоздких СУБД). И во всяком случае во всех типовых они следуют этим рекомендациям. Более того, судя по этому разделу:

    В частности, виртуальная таблица по-разному формирует запросы к базе данных в зависимости от того, какой режим работы у регистра (включено ли хранение актуальных итогов, рассчитаны ли итоги и на какой последний период). Она может как использовать временные таблицы базы данных, так и сформировать подзапрос.

    1С и в самой платформе следует принципу «не полагаться на оптимизаторы СУБД», поэтому у разработчика и выбора то особо не остается. А значит ему приходится ориентироваться на «самое слабое звено» и все оптимизации запросов делать вручную. В частности проталкивать условия запроса внутрь подзапросов. И если с подзапросами это еще как-то можно сделать, то с виртуальными таблицами все не так просто. В них хоть немного сложные условия внешних запросов необходимо преобразовывать в конструкции вида В (Подзапрос). Например:

    ВЫБРАТЬ
        РасходнаяНакладнаяСостав.Номенклатура,
        УчетНоменклатурыОстатки.КоличествоОстаток
    ИЗ
        Документ.РасходнаяНакладная.Состав КАК РасходнаяНакладнаяСостав
            ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.УчетНоменклатуры.Остатки(,
                                 Номенклатура В (
                                       ВЫБРАТЬ Номенклатура
                                       ИЗ Документ.РасходнаяНакладная.Состав
                                       ГДЕ Ссылка = &Документ)) КАК УчетНоменклатурыОстатки
            ПО УчетНоменклатурыОстатки.Номенклатура = РасходнаяНакладнаяСостав.Номенклатура
    ГДЕ
        РасходнаяНакладнаяСостав.Ссылка = &Документ И
        (УчетНоменклатурыОстатки.КоличествоОстаток < РасходнаяНакладнаяСостав.Количество ИЛИ
            УчетНоменклатурыОстатки.КоличествоОстаток ЕСТЬ NULL)
    

    Также, судя по тому, что 1С не рекомендует создавать сложные условия в виртуальных таблицах, самым «слабым звеном» в линейке РСУБД, похоже, является не PostgreSQL, а файловая СУБД (потому как во всяком случае с оптимизацией IN / EXISTS даже PostgreSQL успешно справляется). Как следствие, для нормальной работы, в том числе с файловой СУБД, все запросы надо декомпозировать вплоть до самых примитивных (что в типовых и делают).

    Отсутствие расширенных SQL возможностей


    Как и с оптимизатором запросов, с расширенными SQL возможностями 1С также, похоже, попали в ловушку поддержки различных СУБД, а точнее своей файловой СУБД. Так, для того чтобы поддержать такие уже де-факто стандартные вещи, как оконные функции и рекурсивные CTE, 1С пришлось бы поддержать их и в своей файловой СУБД, что является не такой уж тривиальной задачей. Как следствие, либо по причине сложности реализации, либо все же решив, что эти механизмы слишком сложны для разработчика, в 1С решили этого не делать, и сейчас SQL-диалект 1С соответствует стандарту SQL года так 92. А значит для решения таких простых задач, как расчет нарастающего итога, придется либо серьезно попотеть (чтобы добиться нормальной производительности), либо вернуться в ORM, который, как мы выяснили выше, в 1С тоже не фонтан.

    Отсутствие запросов на изменение


    Активное повсеместное использование запросов позволяет решить проблемы, связанные с чтением большого количества данных. Но так как, в отличии от SQL, в запросах 1С отсутствует механизм изменения данных (так называемый DML), использование запросов никак не может помочь в вопросах записи большого количества данных. То есть, если вам понадобится создать сто тысяч дисконтных карт, вам придется вернуться назад в ORM (то есть к объектам) и генерировать эти объекты по одному с соответствующей не самой высокой производительностью.

    Отказ от автоматических блокировок


    Одной из главных функций SQL серверов является обеспечение целостности данных (буковки CI в ACID). Самым простым способом ее обеспечения является блокировка всех читаемых данных (с защитой их от изменения). Проблема такого подхода в том, что при его использовании очень сильно страдает масштабируемость, в частности, из-за того, что читатель блокирует писателя. То есть грубо говоря, один сложный отчет, читающий большое количество данных, может ввести в ступор всю базу.

    Для борьбы с этим явлением в свое время появились так называемые версионные СУБД. Основная идея этих СУБД состоит в том, чтобы для каждой записи хранить не одну, а несколько версий. Соответственно при начале любой транзакции СУБД запоминает версию базы на момент начала этой транзакции, после чего внутри транзакции читает не текущую запись в таблице, а запись именно на эту «запомненную» версию. Реализуется поддержка различных версий записей (MVCC) в Oracle и PostgreSQL по-разному, но с точки зрения логики обеспечения целостности это не так важно, поэтому останавливаться на этом здесь подробно не имеет особого смысла.

    Такой подход действительно значительно повышает масштабируемость СУБД, но на самом деле это улучшение масштабируемости является следствием частичного отказа от целостности. Так, например, если вы будете проверять, что сумма значений полей из двух разных таблиц должна быть больше некоторого значения, то при одновременном редактировании значений этих полей в обеих таблицах в блокировочнике все будет хорошо (точнее возникнет дедлок, в результате которого одна из транзакций откатится), версионник же благополучно запишет оба этих изменения в базу, нарушив тем самым ваше ограничение. Что же тогда поддерживает версионник в плане целостности? На самом деле фактически он поддерживает только целостность данных, которые физически хранятся в таблицах (для них работает механизм конфликтов записи). Соответственно, чтобы сделать «версионную» базу целостной, существует два очевидных варианта:

    • Материализовать данные, для которых важна целостность. Для этого, конечно, очень желательно иметь механизм прозрачной материализации этих данных, а его, как мы видели, ни в SQL (материализация представлений), ни тем более в 1С, нет.
    • При чтении данных, для которых важна целостность, переводить версионную базу в «блокировочный» режим, то есть читать данные с опцией FOR UPDATE (ДЛЯ ИЗМЕНЕНИЯ).

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

    Но вернемся к 1С. Как же они решили бороться с проблемой масштабируемости автоматических блокировок? Барабанная дробь. Они просто решили переложить эту проблему на разработчика. Одну из самых сложных задач в программировании (организацию многопоточного доступа). Самую неочевидную задачу с точки зрения человеческого мозга. Задачу, которую максимально тяжело тестировать и отлаживать. На разработчика, которым когда-то планировалось должен был быть бухгалтер. Решать императивно — ручной установкой и снятием блокировок.

    Но самое интересное, что большинство разработчиков эту «манипуляцию» со стороны 1С особо и не заметили. Видимо, потому что описанная проблема весьма неочевидна, проявляется только при высококонкурентном доступе и в случае чего списывается на сбой оборудования / плохую погоду, после чего запускается пересчет, перепроверка, данные исправляются и все благополучно забывают про эту проблему до следующего инцидента.

    Формы


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

    Отказ от единого потока выполнения: разделение логики на сервер и клиент


    Первым пал единый поток выполнения. Выполнять бизнес-логику на клиенте, как это делается в двухзвенной архитектуре, неэффективно как с точки зрения масштабируемости (обращений к СУБД по сети, невозможности перераспределения вычислительных мощностей), так и с точки зрения безопасности. Самое очевидное решение этой проблемы — перенести всю логику (как бизнес-логику, так и логику формы) на сервер, а реактивное обновление формы на клиенте и синхронизацию клиентского и серверного потоков выполнения реализовать автоматически средствами платформы. То есть весь поток выполнения хранить и выполнять на сервере (который многопоточен по своей природе), а клиенту оставить чисто техническую функцию — обновлять свое состояние по требованию сервера.

    Что же сделал 1С? Как уже, наверное, многие догадались — переложили все на разработчика. Основной поток выполнения остался на клиенте, разработчику дали возможность создавать серверный поток выполнения, но при этом в клиентском потоке выполнения запретили обращаться к данным, а в серверном потоке выполнения — к пользователю, то есть открывать формы, диалоги и т.п. (реактивное обновление формы на клиенте они все же реализовали, то есть обращаться на сервере к данным формы можно). Как следствие простой случай общения с пользователем:
    f() <- someData(); // читаем данные из базы необходимые для myForm
    DIALOG myForm OBJECTS a INPUT DO // ОткрытьФормуМодально, пользователь выбирает какой-то объект
         IF isSomething(a) DO // читаем данные для этого объекта и если с ними что-то не то
             DIALOG otherForm OBJECTS b = a DO { // ОткрытьФормуМодально, открываем другую форму где пользователь выбирает другой объект b
                 g(b) <- someInput(b); // записываем данные для b
                 APPLY// сохраняем изменения в базу
             }

    превращается в кашу из пяти различных процедур с надуманными именами. Если при этом еще надо передать данные между myForm и otherForm, то придется использовать так называемые временные хранилища (что тоже было бы не нужно, если бы поток выполнения был на сервере) в результате чего код усложняется еще больше.

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

    • Достаточно большой оверхед при передаче данных формы на сервер при каждом серверном вызове (особенно если в форме много данных). И судя по наличию оптимизационной опции &НаСервереБезКонтекста в 1С это понимают. Конечно, можно было бы хранить данные формы на сервере и слать их изменение в обе стороны (а не только в одну), но тогда возникает другой вопрос.
    • Почему не реализовать «зеркалирование» данных формы и состояния серверного потока выполнения на другие сервера приложений (как это например делает Java EE) или на сам клиент. Это решило бы проблему масштабируемости и отказоустойчивости, не напрягая при этом разработчика.
    • Вероятность падения клиента (по причине пропажи электричества, вируса, обновления windows и сотни других причин) куда выше, чем вероятность падения сервера приложений при его грамотном администрировании. И реально критично только для очень крупных компаний (а так страдают все)

    Отказ от синхронности


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

    • браузерам не очень нравится (так как они считают это спамом и по умолчанию блокируют)
    • создает отдельный процесс в ОС, что не очень хорошо с точки зрения производительности
    • блокирует старое окно целиком

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

    Что же они сделали? Думаете, попытались сохранить состояние потока выполнения, передать выполнение новому потоку, а по его завершению автоматически восстановить старое состояние? Как бы не так, делать что-то автоматически это, похоже, не их стиль. В 1С опять-таки решили все переложить на разработчика. Причем с весьма издевательским комментарием по этому поводу:

    Следует отметить, что поначалу асинхронная модель может показаться сложнее привычной синхронной. На самом деле, понимая основные различия этих моделей, разработка асинхронных приложений становится не многим труднее.

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

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

    &НаКлиенте
    Процедура ВыполнитьОперацию(Команда)
           Оп = Новый ОписаниеОповещения("ВыполнитьОперациюЗавершение", ЭтотОбъект);
           ПолучитьТекстВыбора(Оп);
    КонецПроцедуры
    
    &НаКлиенте
    Процедура ВыполнитьОперациюЗавершение(Результат, Параметры) Экспорт
           Сообщить(Результат);
    КонецПроцедуры
    
    
    &НаКлиенте
    Процедура ПолучитьТекстВыбора(ОбработкаОповещения)
           Контекст = Новый Структура("СледующееОповещение", ОбработкаОповещения);
           Оп = Новый ОписаниеОповещения("ПолучитьТекстВыбораЗавершение", ЭтотОбъект, Контекст);
           ПоказатьВопрос(Оп, "Продолжить операцию?", РежимДиалогаВопрос.ДаНет);
    КонецПроцедуры
    
    
    &НаКлиенте
    Процедура ПолучитьТекстВыбораЗавершение(Результат, Контекст) Экспорт
           Стр = ?(Результат = КодВозвратаДиалога.Да, 
                 "Продолжаем выполнять операцию...", 
                 "Операция прервана!");
           Если Контекст <> Неопределено И Контекст.СледующееОповещение <> Неопределено Тогда
                 ВыполнитьОбработкуОповещения(Контекст.СледующееОповещение, Стр);
           КонецЕсли;
    КонецПроцедуры
    

    Отказ от WYSIWYG: разделение интерфейса на запись и чтение


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

    В ранних версиях 1С было всего несколько вариантов работы с данными в списках. К списку можно было привязать:

    • Первичные данные: объекты (справочники, документы), их агрегированные объекты (табличные части) и т.д.
    • Программно создаваемую таблицу: таблицу значений, читать данные в которую и записывать данные из которой разработчик должен вручную.

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

    • С учетом отсутствия оптимизатора запросов, в этих запросах фактически нельзя использовать подзапросы / виртуальные таблицы на дату и / или с условием на источник данных. Дело в том, что в динамическом списке предполагается считывание только видимой части записей (например первых 50), а учитывая, что, как уже отмечалось выше, автоматическое проталкивание условий верхнего запроса внутрь подзапроса 1C не поддерживает, а как протолкнуть эти условия вручную (к чему обратиться для получения видимой части в запросе) — непонятно. То есть, если в качестве запроса динамического списка написать запрос:
      ВЫБРАТЬ
      			Товар.МояДата КАК МояДата,
      			Товар.Цена КАК Цена,
      			ДвиженияОстатков.ЧислоОстаток КАК Число
      		ИЗ
      			Справочник.Товар КАК Тов
      				ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ДвиженияОстатков.Остатки(&Дата, ) КАК ДвиженияОстатков
      				ПО ДвиженияОстатков.Товар = Тов.Ссылка"
      

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

      Что сделали в 1С? Ну вы поняли. Просто запретили (а точнее, не поддержали) редактирование динамических списков. Причем, так как механизм динамических списков стал основным механизмом работы со списками, заодно запретили редактирование и списков с первичными данными (справочниками и документами, то есть то, что работало в предыдущих версиях). Ну и объяснили это в стиле «просто не держите его так». А если очень хочется, то используйте таблицы значений. Правда, чтобы с использованием таблиц значений реализовать функционал динамического списка (с чтением только видимых записей), нужно, мягко говоря, серьезно повозиться.

      Как следствие, на практике в 1С есть строгое разделение интерфейса на списки, где идет чтение данных, и на списки, где идет ввод данных (такой анти-WYSIWYG). Особенно наглядно эта разница видна на примере подбора товаров в типовых конфигурациях, где пользователь в одном списке выбирает товары, а во втором вводит количество этих товаров. Впрочем, про это была отдельная статья, поэтому подробно на этой теме останавливаться не будем.

    Невозможность обращаться в списках к реквизитам форм / текущим значениям других списков


    Эта проблема может показаться менее существенной по сравнению с описанными выше, но, на мой взгляд, ее также не стоит недооценивать. Фактически эта проблема означает, что все списки / объекты на форме в 1С сами по себе, а связывать их друг с другом разработчику необходимо самостоятельно императивным кодом в подписках на различные события.

    Так, например, если мы хотим в форме документа показать список договоров поставщика этого документа, нам надо:

    • В запрос списка договоров добавить параметр &Поставщик и использовать его для отбора нужных договоров
    • Обновлять этот параметр при:
      • Открытии формы
      • Изменении поставщика в документе пользователем
      • Выборе другого документа (например, если на форме отображается список документов)
      • При обновлении данных формы (так как поставщик мог быть изменен другим пользователем, а пользователь нажал обновить)

    И это в самом простом случае. Если условие «соединения данных» на форме сделать еще более сложным, событий и кода их обработки понадобится еще больше.

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

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

    Избыточные уровни абстракций


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



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

    • Объекты / записи

      Это разделение уже упоминалось в разделе про ORM. Причем тут вопрос не к понятию объект, как таковому (это понятие есть везде), а в том, что в 1С объекты, как и записи (регистры), также отвечают за хранение данных. Собственно, верхняя картинка и получается настолько большой и сложной по причине того, что 1С пытается усидеть сразу на двух стульях.
    • Объекты / ссылки на объекты

      Очень странное разделение, которое поначалу сильно сбивает с толку. Я сначала думал, что это своего рода аналог ссылок / объектов в C#, C++. Но это не так. Фактически ключевое отличие этих двух понятий заключается в том, что объекты используются для записи и чтения, а ссылки — только для чтения. Конечно физически там больше нюансов — при обращении по ссылке объект читается неявно и сохраняется в кэше на какое-то время (разработчик этим никак не управляет), а чтением объекта (и остальным циклом его жизни) управляет разработчик. Но логически разницы никакой, и ни в какой другой технологии (что ORM, что не ORM) такого разделения нет.
    • Данные формы / Данные объектов

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

      И если с данными формы такое разделение было во многом вынужденным, то зачем понадобилось разделять команды формы и действия, я, если честно, не совсем понял. Может в комментариях кто-нибудь сможет это объяснить.

      В любом случае с управляемыми формами разработчики 1С явно перемудрили, все можно было сделать гораздо проще. Правда, скорее всего избавившись от первоначальных проблем (то есть разделения логики на сервер и клиент, и на объекты и записи).
    • Запросы / СКД / Аналитика (BI)

      Обычно бизнес-приложения принято разделять на два контура: OLTP и OLAP. В первом люди работают по более-менее конкретным бизнес-процессам: получают и вводят одну и ту же информацию и нажимают на одни и те же кнопки в одних и тех же доступных им формах. OLAP — творческий контур, в нем пользователи обычно «играют» с информацией, получая эту информацию в различных заранее неизвестных срезах. В OLTP люди обычно принимают оперативные решения и отражают уже произошедшие события, OLAP же используется для принятия стратегических решений. Понятно, что в жизни есть полутона, когда пользователю и в OLTP нужна какая-то гибкость, но как правило она ограничивается простыми отборами, сортировками и выбором / изменением размеров колонок, так как бОльшая гибкость будет, во-первых, слишком сложна для пользователя (многим даже отборы с трудом даются), а во-вторых, необходимость этой гибкости говорит о несовершенстве бизнес-процессов и если один более продвинутый пользователь догадается это несовершенство побороть, то второй пользователь так и будет продолжать работать неэффективно. Плюс надо понимать, что при сильном изменении структуры информации формы часто требуется изменение физической модели, например, материализация промежуточной информации (как это обычно делается в OLAP), что с одной стороны позволяет не нагружать оперативную базу долгими запросами, а с другой стороны позволяет пользователю получать информацию за секунды.

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

      Но в 1С решили сделать не как все. Они реализовали так называемую систему компоновки данных (СКД) с очень непонятной областью применения:

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

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

    Закрытая физическая модель


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

    Открытая же физическая модель дала бы огромное количество возможностей: от простой интеграции на чтение со стороны тех же OLAP систем до возможности использования встроенных средств СУБД, таких как рекомендация построения индексов, профилировщиков и так далее (без необходимости гадания, что же это за поля и таблицы — _Fld16719 и _Document5759).

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

    Отсутствие наследования и полиморфизма


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

    Ну и, конечно, с аргументом «покажите, что можно реализовать с наследованием и полиморфизмом, чего нельзя реализовать с помощью if'ов» тяжело спорить. Но к чему приводит отсутствие наследования, как раз хорошо иллюстрируют типовые 1С, где для того, чтобы поддержать некую общую логику, скажем для всех строк документов:

    • Делают общую процедуру ОбработатьСтрокуТЧ, которая должна вызываться для всех строк документов (кстати одно из немногих мест, где используется ORM, а не запросы)
    • Внутри этой процедуры пишут реализации всех существующих классов строк документов:

      Процедура ОбработатьСтрокуТЧ
      Процедура ОбработатьСтрокуТЧ(ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения) Экспорт
      	
      	Если КэшированныеЗначения = Неопределено Тогда
      		КэшированныеЗначения = ОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруКэшируемыеЗначения();
      	КонецЕсли;
      	
      	ПроверитьАссортиментСтроки(                             										ТекущаяСтрока, СтруктураДействий);
      	ЗаполнитьНоменклатуруПоНоменклатуреПоставщикаВСтрокеТЧ( 										ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
      	ЗаполнитьНоменклатуруПоставщикаПоНоменклатуреВСтрокеТЧ( 										ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
      	ПроверитьСопоставленнуюНоменклатуруПоставщикаВСтрокеТЧ( 										ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
      	ЗаполнитьСлужебныеРеквизитыПоНоменклатуреВСтрокеТЧ(     										ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
      	ПроверитьКорректностьЗаполнитьХарактеристикиИУпаковки(  										ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
      	ПроверитьКорректностьЗаполнитьХарактеристикиКиЗ(												ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
      	ОбработкаТабличнойЧастиКлиентСервер.ПересчитатьКоличествоНеОтгружатьСтрокеТЧ(					ТекущаяСтрока, СтруктураДействий);
      	ЗаполнитьGTINВСтроке(                                                                           ТекущаяСтрока, СтруктураДействий);
      	ОбработкаТабличнойЧастиКлиентСервер.ПересчитатьКоличествоУпаковокПоФактуВСтрокеТЧ(				ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения); 
      	ОбработкаТабличнойЧастиКлиентСервер.ПересчитатьКоличествоУпаковокСуффиксИзОтклоненияВСтрокеТЧ(	ТекущаяСтрока, СтруктураДействий);
      	ОбработкаТабличнойЧастиКлиентСервер.ПересчитатьКоличествоЕдиницВСтрокеТЧ(						ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
      	ОбработкаТабличнойЧастиКлиентСервер.ПересчитатьКоличествоЕдиницСуффиксВСтрокеТЧ(				ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
      	ОбработкаТабличнойЧастиКлиентСервер.ПересчитатьКоличествоУпаковокВСтрокеТЧ(						ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
      	ОбработкаТабличнойЧастиКлиентСервер.ПересчитатьКоличествоУпаковокСуффиксВСтрокеТЧ(				ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
      	ОбработкаТабличнойЧастиКлиентСервер.ПересчитатьКоличествоОтклонение(						    ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
      	ОбработкаТабличнойЧастиКлиентСервер.ПересчитатьКоличествоУпаковокПоВесу(						ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
      	ОбработкаТабличнойЧастиКлиентСервер.ПересчитатьКоличествоУпаковокПоОбъему(						ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
      	ОбработкаТабличнойЧастиКлиентСервер.ПересчитатьВесОбъемВСтрокеТЧ(								ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
      	ОбработкаТабличнойЧастиКлиентСервер.ПересчитатьЦенуЗаУпаковкуВСтрокеТЧ(							ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
      	ОбработкаТабличнойЧастиКлиентСервер.ПересчитатьЦенуЗаказаЗаУпаковкуВСтрокеТЧ(					ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
      	ЗаполнитьВидЦеныВСтрокеТЧ(                              										ТекущаяСтрока, СтруктураДействий); 
      	ЗаполнитьЦенуПродажиВСтрокеТЧ(                          										ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
      	ЗаполнитьЦенуПродажиПоАссортиментуВСтрокеТЧ(            										ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
      	ЗаполнитьЦенуЗакупкиВСтрокеТЧ(                          										ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
      	ЗаполнитьУсловияПродажВСтрокеТЧ(                        										ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
      	ЗаполнитьУсловияЗакупокВСтрокеТЧ(                       										ТекущаяСтрока, СтруктураДействий);
      	ЗаполнитьПартиюТМЦВЭксплуатации(                        										ТекущаяСтрока, СтруктураДействий);
      	ЗаполнитьСтавкуНДСВСтрокеТЧ(                            										ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
      	ЗаполнитьСтавкуНДСПоНоменклатуреВСтрокеТЧ(              										ТекущаяСтрока, СтруктураДействий);
      	ПересчитатьЦенуСНДС(                                    										ТекущаяСтрока, СтруктураДействий);
      	ОбработкаТабличнойЧастиКлиентСервер.ЗаполнитьСтавкуНДСВозвратнойТарыВСтрокеТЧ(					ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
      	ОбработкаТабличнойЧастиКлиентСервер.ПересчитатьСуммуРучнойСкидкиВСтрокеТЧ(						ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
      	ОбработкаТабличнойЧастиКлиентСервер.ПересчитатьСуммуАвтоматическойСкидкиВСтрокеТЧ(
      		ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
      	ОбработкаТабличнойЧастиКлиентСервер.ПересчитатьПроцентРучнойСкидкиВСтрокеТЧ(					ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
      	ОбработкаТабличнойЧастиКлиентСервер.ПересчитатьСуммуВСтрокеТЧ(								ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
      	ОбработкаТабличнойЧастиКлиентСервер.ПересчитатьСуммуВСтрокеТЧРасхождения(						ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
      	ОбработкаТабличнойЧастиКлиентСервер.ПересчитатьЦенуСкидкуПоСуммеВПродажахВСтрокеТЧ(				ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
      	ОбработкаТабличнойЧастиКлиентСервер.ПересчитатьЦенуСкидкуПоСуммеВЗакупкахВСтрокеТЧ(				ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
      	ОбработкаТабличнойЧастиКлиентСервер.ПересчитатьЦенуПоСуммеВСтрокеТЧ(							ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
      	ПересчитатьСуммуПродажиПоСуммеСНДС(                     										ТекущаяСтрока, СтруктураДействий);
      	ОбработкаТабличнойЧастиКлиентСервер.ПересчитатьЦенуПродажиПоСуммеПродажиВСтрокеТЧ(				ТекущаяСтрока, СтруктураДействий);
      	ОбработкаТабличнойЧастиКлиентСервер.ПересчитатьСуммуСУчетомАвтоматическойСкидкиВСтрокеТЧ(		ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
      	ОбработкаТабличнойЧастиКлиентСервер.ПересчитатьСуммуСУчетомРучнойСкидкиВСтрокеТЧ(				ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
      	ОбработкаТабличнойЧастиКлиентСервер.ПересчитатьСуммуСУчетомСкидкиБонуснымиБалламиВСтрокеТЧ(		ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
      	ПересчитатьСуммуСУчетомПогрешностиОкругленияВСтрокеТЧ(  										ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
      	ПересчитатьСуммуНДСВСтрокеТЧ(                           										ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
      	ОбработкаТабличнойЧастиКлиентСервер.ПересчитатьСуммуСНДСВСтрокеТЧ(								ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
      	ОбработкаТабличнойЧастиКлиентСервер.ПересчитатьСуммуБезНДСВСтрокеТЧ(							ТекущаяСтрока, СтруктураДействий);
      	ОбработкаТабличнойЧастиКлиентСервер.ПересчитатьСуммуРеглВСтрокеТЧ(								ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
      	ОбработкаТабличнойЧастиКлиентСервер.ПересчитатьНДСРеглВСтрокеТЧ(								ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
      	ОбработкаТабличнойЧастиКлиентСервер.ПересчитатьСуммуПродажиВСтрокеТЧ(							ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
      	ОбработкаТабличнойЧастиКлиентСервер.ПересчитатьСуммуПродажиНДСВСтрокеТЧ(						ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
      	ЗаполнитьРеквизитыПоНоменклатуреВСтрокеТЧ(              										ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
      	ОбработкаТабличнойЧастиКлиентСервер.ПроверитьСтатьюАналитикуРасходов(                       	ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
      	ОбработкаТабличнойЧастиКлиентСервер.ОчиститьСуммуВознагражденияВСтрокеТЧ(                   	ТекущаяСтрока, СтруктураДействий);
      	ОбработкаТабличнойЧастиКлиентСервер.УстановитьАктивностьСтроки(                             	ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
      	ПроверитьЗаполнитьСкладВСтрокеТЧ(                       										ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
      	ПроверитьЗаполнитьОбеспечениеВСтрокеТЧДокументаПродажи(											ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
      	ПроверитьЗаполнитьОбеспечениеВСтрокеТЧ(                 										ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
      	ПроверитьПолучитьВариантКомплектации(                   										ТекущаяСтрока, СтруктураДействий);
      	ОбработкаТабличнойЧастиКлиентСервер.ЗаполнитьФлагиРасхождениеИИзлишекПорча(                 	ТекущаяСтрока, СтруктураДействий);
      	ОбработкаТабличнойЧастиКлиентСервер.ОчиститьСуммуВзаиморасчетовВСтрокеТЧ(                   	ТекущаяСтрока, СтруктураДействий);
      	ОбработкаТабличнойЧастиКлиентСервер.ОчиститьАвтоматическуюСкидкуВСтрокеТЧ(                  	ТекущаяСтрока, СтруктураДействий);
      	ЗаполнитьСодержаниеУслуги(                              										ТекущаяСтрока, СтруктураДействий);
      	ЗаполнитьСтатьюАналитикуРасходовПоУмолчанию(            										ТекущаяСтрока, СтруктураДействий);
      	ОбработкаТабличнойЧастиКлиентСервер.ЗаполнитьПартнера(                                      	ТекущаяСтрока, СтруктураДействий);
      	ЗаполнитьПомещение(                                     										ТекущаяСтрока, СтруктураДействий);
      	ЗаполнитьПродавца(                                      										ТекущаяСтрока, СтруктураДействий);
      	ЗаполнитьУчетноеКоличествоНоменклатуры(                 										ТекущаяСтрока, СтруктураДействий);
      	ЗаполнитьПризнакНаличияНоменклатурыПродаваемойСовместно(										ТекущаяСтрока, СтруктураДействий);
      	ОбработкаТабличнойЧастиКлиентСервер.ЗаполнитьПризнакБезВозвратнойТары(	                     	ТекущаяСтрока, СтруктураДействий);
      	ОбработкаТабличнойЧастиКлиентСервер.ЗаполнитьПризнакОтмененоБезВозвратнойТары(              	ТекущаяСтрока, СтруктураДействий);
      	ОбработкаТабличнойЧастиКлиентСервер.ЗаполнитьПризнакАктивностьБезВозвратнойТары(            	ТекущаяСтрока, СтруктураДействий);
      	ОбработкаТабличнойЧастиКлиентСервер.ЗаполнитьДубликатыЗависимыхРеквизитов(                  	ТекущаяСтрока, СтруктураДействий);
      	ПроверитьСериюРассчитатьСтатус(                         										ТекущаяСтрока, СтруктураДействий);
      	ОбработкаТабличнойЧастиКлиентСервер.ПересчитатьСуммуСверхЗаказаВСтрокеТЧ(                   	ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
      	УстановитьПризнакДляЗаполненияТекстовогоОписания(       										ТекущаяСтрока, СтруктураДействий);
      	ОбработкаТабличнойЧастиКлиентСервер.ЗаполнитьВариантОтраженияКорректировкиРеализации(       	ТекущаяСтрока, СтруктураДействий);
      	ЗаполнитьВариантОбеспеченияПоДатеОтгрузки(              										ТекущаяСтрока, СтруктураДействий);
      	ОбработкаТабличнойЧастиКлиентСервер.НоменклатураПриИзмененииПереопределяемый(               	ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
      	ОбработкаТабличнойЧастиКлиентСервер.ХарактеристикаПриИзмененииПереопределяемый(             	ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
      	ЗаполнитьПризнакПринимаетсяКНУ(           										ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
      	ЗаполнитьПризнакАналитикаРасходовОбязательна(           										ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
      	ЗаполнитьПризнакРаспределениеНДС(                       										ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
      	ЗаполнитьПризнакАналитикаДоходовОбязательна(            										ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
      	ЗаполнитьПризнакАналитикаАктивовПассивовНеИспользуется( 										ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
      	ЗаполнитьПризнакАналитикаРасходовЗаказРеализация(       										ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
      	ЗаполнитьТипСтатьи(               																ТекущаяСтрока, СтруктураДействий);
      	ЗаполнитьПризнакАдресногоХранения(                     											ТекущаяСтрока, СтруктураДействий);
      	ЗаполнитьПризнакИспользованияПомещений(															ТекущаяСтрока, СтруктураДействий);
      	ОбработкаТабличнойЧастиКлиентСервер.ЗаполнитьПризнакиКатегорииЭксплуатации(                 	ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
      	ОбработкаТабличнойЧастиКлиентСервер.ЗаполнитьРасхожденияПослеОтгрузки(                          ТекущаяСтрока, СтруктураДействий);
      	ОбработкаТабличнойЧастиКлиентСервер.ЗаполнитьРасхожденияПослеПриемки(                           ТекущаяСтрока, СтруктураДействий);
      	ОбработкаТабличнойЧастиКлиентСервер.ЗаполнитьРасхождения(                                       ТекущаяСтрока, СтруктураДействий);
      	ОбработкаТабличнойЧастиКлиентСервер.ЗаполнитьПризнакНаличияКомментарияПриемка(                  ТекущаяСтрока, СтруктураДействий);
      	ОбработкаТабличнойЧастиКлиентСервер.ЗаполнитьПризнакНаличияКомментарияОтгрузка(                 ТекущаяСтрока, СтруктураДействий);
      	ОбработкаТабличнойЧастиКлиентСервер.ЗаполнитьПризнакНаличияКомментария(							ТекущаяСтрока, СтруктураДействий);
      	ОбработкаТабличнойЧастиКлиентСервер.ЗаполнитьПризнакТоварногоМестаТребуетсяОбработка(			ТекущаяСтрока, СтруктураДействий);
      	ЗаполнитьПризнакДвиженияПоСкладскимРегистрам(ТекущаяСтрока, СтруктураДействий);	
      	ОбработкаТабличнойЧастиКлиентСервер.ПриИзмененииТипаНоменклатурыИлиВариантаОбеспечения(ТекущаяСтрока, СтруктураДействий);
      	ОбработкаТабличнойЧастиКлиентСервер.ПроверитьЗаполнитьНазначениеВСтрокеТЧ(                  	ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
      	ОбработкаТабличнойЧастиКлиентСервер.ПриИзмененииНазначенияВСтрокеТЧ(                            ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
      	ЗаполнитьНоменклатуруЕГАИС(                                                                     ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
      	АкцизныеМаркиКлиентСервер.ЗаполнитьИндексАкцизнойМаркиДляСтрокиТабличнойЧасти(                  ТекущаяСтрока, СтруктураДействий);
      	ЗаполнитьСтрануПроисхожденияДляНомераГТД(                                                       ТекущаяСтрока, СтруктураДействий);
      	ЗаполнитьСпособОпределенияСебестоимости(                                                        ТекущаяСтрока, СтруктураДействий);
      	ЗаполнитьСпособОпределенияСебестоимостиСтрокой(                                                 ТекущаяСтрока, СтруктураДействий);
      	ПоместитьОбработанныеСтрокиВКэшированныеЗначения(                                               ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
      	
      КонецПроцедуры
      

    • Внутри каждой реализации проверка на наличие поля (которое по сути и является признаком принадлежности классу строки документа):

      	Процедура ЗаполнитьПризнакНаличияКомментарияПриемка(ТекущаяСтрока, СтруктураДействий) Экспорт
      
      	Если НЕ СтруктураДействий.Свойство("ПризнакНаличиеКомментарияПриемка") Тогда
      		
      		Возврат;
      		
      	КонецЕсли;
      	
      	ТекущаяСтрока.ЕстьКомментарийПоставщика = НЕ ПустаяСтрока(ТекущаяСтрока.КомментарийПоставщика);
      	ТекущаяСтрока.ЕстьКомментарийМенеджера = НЕ ПустаяСтрока(ТекущаяСтрока.КомментарийМенеджера);
      
      КонецПроцедуры
      

    Я участвовал в написании кода в таком стиле лет 20 назад на Foxpro (тоже на IF TYPE(«tableA.fldB») = «C») и думал, что такой подход умер еще тогда. Но нет, оказывается он даже в 2019 году живее всех живых.

    P.S.: Как могли бы выглядеть наследование и полиморфизм в 1С разбиралось в недавней статье, поэтому подробно на этой теме здесь также останавливаться не будем.

    Отсутствие явной типизации в коде


    С явной типизацией в 1С все не так однозначно. Частично она есть — при создании любого реквизита можно и нужно указать его тип (класс). Конечно, тут возникает вопрос, что делать если значение реквизита может быть не одного типа (а наследование, как мы помним, в 1С отсутствует). Для таких случаев в 1С поддерживаются так называемые составные типы, когда в качестве типа можно указать не один, а сразу несколько типов. Эффективность реализации этих составных типов, конечно, оставляет желать лучшего:

    Рекомендации по использованию составных типов
    • Используйте поля составных типов только тогда, когда это является оправданным с точки зрения логики функционирования конфигурации.
    • Не используйте составные типы, кроме ссылочных, для полей, по которым связываются таблицы. Например, если в документах «ПриходнаяНакладная» и «РасходнаяНакладная» есть реквизит «Контракт» составного типа, то исполнение следующего запроса может быть неэффективным:
      ВЫБРАТЬ ПриходнаяНакладная.Контракт
      ИЗ Документ.ПриходнаяНакладная КАК ПриходнаяНакладная
      ЛЕВОЕ СОЕДИНЕНИЕ Документ.РасходнаяНакладная КАК РасходнаяНакладная
      ПО ПриходнаяНакладная.Контракт = РасходнаяНакладная.Контракт
      

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


    Другими словами, не рекомендуется использовать никогда (ключевой момент тут на самом деле в неэффективном сравнении полей с разным количеством типов). Но как говорится: «На безрыбье и рак — рыба».

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

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

    Отсутствие модульности


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

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

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

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

    Во-вторых, одних только расширений для обеспечения модульности недостаточно — нужны еще:

    • расширения запросов, которые, как мы помним, в 1С как правило задаются обычными строками (а при помощи запросов реализуется бОльшая часть бизнес-логики)
    • события изменения данных, которые формально существуют, но в них либо возникает проблема N+1, либо логика в них также описывается запросами, а значит смотри предыдущий пункт. Плюс в 1С есть только события изменения первичных данных, события изменения вычисляемых данных (например, регистров), как мы видели выше, в 1С не поддерживаются.
    • наследование и полиморфизм, которых, как мы уже выяснили, в 1С также нет
    • агрегации, которые нужны, когда наследования недостаточно

    Но в целом инициатива с расширениями, конечно, правильная, хотя на текущем этапе до реальной модульности 1С еще ой как далеко. И последние версии типовых решений — это по прежнему один большой монолит. Причем по мере роста сложности этих решений возникает следующая парадоксальная ситуация:

    • Чем сложнее решение, тем сложнее его дорабатывать (особенно с учетом плохой модульности, а значит сильной связности кода)
    • Чем сложнее решение, тем с меньшей вероятностью оно подойдет под существующие на предприятии бизнес-процессы (а значит это решение придется дорабатывать)

    Как следствие, в последних версиях 1С постепенно приобретает «болезнь SAP» — на любое пожелание заказчика, ему говорится: «вы просто неправильно работаете, есть best practice, вы тоже должны работать именно так». И не важно, что бизнес по торговле автомобильными запчастями отличается от бизнеса по торговле нефтью чуть менее, чем полностью (если конечно речь не идет об автоматизации уровня «пришло-ушло-осталось»). А именно максимальная гибкость и свои ноу-хау позволяет малому и среднему бизнесу противостоять крупным корпорациям в борьбе за рынок. Нет — все должны работать одинаково. Да, конечно, в монолите часто делают миллионы настроек, но:

    • гибкость таких настроек по определению сильно ограничена (обычно это не более, чем просто включение / выключение различных сценариев)
    • они сильно перегружают интерфейс (когда пользователю приходится работать по инструкции: зайдите на третью вкладку, включите пятую галочку, заполните десятое поле)
    • они не в состоянии полностью исключить избыточное потребление ресурсов. То есть настройка может быть выключена, но поля в таблицах в базе все равно будут (а значит будут потреблять лишнее место, попадать в кэши СУБД), часть общего кода все равно будет выполняться и так далее.

    Ставка на визуальное программирование


    Тема с визуальным программированием, а точнее low-code / no-code платформами то и дело всплывает то тут, то там с завидной регулярностью. Позиционируют себя эти платформы, как средства ускоряющие / упрощающие разработку. При этом почему программирование мышкой по их мнению должно быть априори эффективнее программирования клавиатурой — непонятно. Разработку действительно можно ускорить / упростить повышением уровня абстракций, но никак не способом ввода этих абстракций в систему. Одна строка кода в этом смысле лучше, чем пять кликов / перетаскиваний мышкой, не говоря уже о том, что скорость работы с клавиатурой у опытного разработчика как правило выше, чем скорость работы с мышкой. Поэтому утверждения «ну раз код писать не надо, то и разработчик не нужен» не более, чем маркетинговая уловка.

    Но попробуем взвесить все за и против обоих подходов (Все-в-виде-кода vs Визуальное программирование). Итак, преимущества всего в виде кода:

    • Система контроля версий — поддержка gitflow из коробки (например возможность выполнения операций слияния веток и разрешения конфликтов при этом слиянии)
    • Метапрограммирование / кодогенерация — возможность использовать макросы и / или механизмы шаблонов в IDE
    • Копирование — можно взять любой кусок кода, клонировать его, а затем, если нужно «тоже самое, но с перламутровыми пуговицами» групповым изменением, например, поменять в клонированном коде одно слово на другое
    • Редактирование — код можно просмотреть в любом текстовом редакторе, переслать через мессенджер, разместить на форуме и т.п.
    • Унифицированность — для кода есть готовая инфраструктура и стандарты работы с ним в IDE (например стандартные действия по переходу к объявлению, поиск использований, установка брейкпоинтов и т.п.). То есть разработчик работая с любым языком по умолчанию знает все интерфейсы работы с любым элементом этого языка.
    • Отладка — любой элемент можно легко идентифицировать по файлу и номеру строки в коде
    • Лаконичность — в коде видно только то, что было изменено / реально используется, в отличие от визуального программирования, где разработчику информация вываливается вся сразу:

      Пример визуальной настройки


    Преимущества визуального программирования:

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

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

    Но вернемся к 1С. Судя по тому, что основную ставку 1С решили сделать на EDT, там все вышесказанное тоже отлично понимают и поэтому старательно пытаются исправить «ошибки прошлого». Но так как платформа у них принципиально не language-based, в 1С решили сделать это, преобразовав все свои прикладные абстракции не в свой язык, а в XML. Выглядит это конечно на любителя. Мало того что язык XML сам по себе достаточно громоздкий, так они еще:

    • выгружают туда значения всех свойств (в том числе тех, которые не изменялись). В результате структура примитивного документа (без кода вообще) занимает 1336 строк.
    • часто используют сгенерированные id, которые, конечно, с одной стороны помогают решить проблемы с миграцией, но с другой стороны требуют при написании кода дополнительные инструменты для их генерации.

    Соответственно просматривать / редактировать такой код руками — так себе удовольствие. Поэтому ни о каких преимуществах подхода Все-в-виде-кода, в том виде в котором он реализован в 1С, к сожалению говорить не приходится. То есть, как говорится, хотели как лучше, а получилось как всегда.

    Фатальный недостаток


    Шутка про фатальный недостаток, пришедшая из Microsoft в 1С, заиграла новыми красками. Попробуем пересчитать все то, что 1С написали сами, и аналоги чего уже существуют и используются во всем мире:

    • IDE — IDEA, Eclipse, Microsoft Visual Studio / VSCode используются повсеместно и имеют достаточно развитую инфраструктуру для написания сторонних плагинов. Конфигуратор по сравнению с той же IDEA играет не то что в другой лиге, а можно сказать в другой вид спорта.
    • Систему контроля версий — тут git победил всех, хотя subversion и mercurial тоже местами держатся. Ну а механизму системы контроля версий в 1С до git, мягко говоря, очень далеко.
    • СУБД — тут они хотели скорее всего упростить процесс развертывания среды разработки / выполнения, но реализовать СУБД даже на уровне PostgreSQL, задача не самая простая. И, как мы видели в разделе Запросы, 1С реализовал свою СУБД где-то на уровне SQL-92 и тем самым выстрелили себе в ногу, сделав невозможным использование даже базовых возможностей нормальных СУБД.

      Ну и конечно своя сборка PostgreSQL, когда можно было обойтись правильным его использованием (судя по списку изменений, которые 1С там сделал), это конечно за гранью. Очень напоминает старый анекдот.
    • Систему отчетности — в мире таких систем тоже огромное количество, но тут особенность в том, что они все используются только для формирования печатных форм. В 1С отчеты еще зачем-то пытаются выполнять функции обычных форм (то есть обладают интерактивностью) и BI. Так что если бы даже в 1С попытались воспользоваться готовыми системами отчетности, у них все равно не получилось бы это сделать.
    • Язык — со своим языком в 1С вообще непонятно. Ладно еще то, что ключевые слова в нем могут быть на русском, есть расхожее мнение, что это понижает порог вхождения, так как много русскоязычных жителей не знают английский (хотя китайцам это не мешает почему-то). Но у них же платформа не language-based (как, например, SAP или SQL, где все их возможности в языке), а значит и смысл своего языка теряется практически полностью. То есть никаких преимущества от наличия своего языка 1С не получает, а вот все недостатки присутствуют в полном объеме. Как в той шутке: «я сегодня таксиста обманул, заплатил, а не поехал». Плюс 1С по какой-то непонятной логике держит свой язык на максимально примитивном уровне. Видимо, они считают, что явная типизация, наследование или замыкания / лямбды — это слишком сложно для разработчика, а ручные блокировки, директивы компиляции, callback'и на клиенте и тонны своих сложных дублирующих друг друга абстракций — вполне нормально.
    • Системы сборки / управления зависимости — у систем сборки лидеры наверное Jenkins и TeamCity, для управлений зависимости у каждого языка свой лидер у Java — Maven, Gradle, у JavaScript — npm, у Python — pip и т.д. У всех них есть большие community, центральные репозитории библиотек, поддержка версионности из коробки, поддержка со стороны многочисленных IDE и куча чего еще. Но для экосистемы 1С это все опять-таки, видимо, слишком сложно, поэтому у них все свое, что по уровню, конечно, и близко не дотягивает до текущих лидеров на рынке.
    • UI фреймворки. Тут я досконально не изучал их внутренности, но факт того, как мучительно долго они добавляли поддержку Linux, а потом MacOS (хотя при условии использования той же Java они получили бы все это практически из коробки), говорит о том, что удержаться от соблазна «изобрести свой велосипед с квадратными колесами» и в этом случае они скорее всего не смогли.

    Стоит отметить, что тупиковость первых двух веток в самом 1С также отлично понимают, и поэтому уже лет пять пишут свой плагин под Eclipse. Правда, судя по отзывам, делают это они с переменным успехом, потому как обеспечить нормальную производительность на кодовой базе даже УТ (не говоря уже про ERP) не так то просто. Особенно с учетом того, что не факт, что в том же Eclipse есть инфраструктура stub индексов, ленивого парсинга (chameleon токенов), language injection и т.п., как в той же IDEA (если же в Eclipse это все есть, то непонятно, что можно разрабатывать такое количество времени и не сделать EDT основным инструментом разработки).

    В любом случае, с EDT 1С кроме всего вышеперечисленного нужно поддерживать и разрабатывать еще одну IDE. Поэтому неудивительно, что в последнее время они начали действовать по принципу «нужно больше золота». Страшно представить, что будет, если Eclipse совсем умрет под натиском IDEA, и в 1С решат написать еще одну IDE.

    Неуважительные по отношению к разработчикам лицензирование и брендирование


    У 1С конечно очень своеобразная политика лицензирования. Например: 1С: Предприятие 8. Управление торговлей стоит 22 600 рублей. На неограниченное число пользователей (!). В чем спросите вы подвох? А он в том, что основная стоимость в платформе: 1С: Предприятие 8 ПРОФ. Клиентская лицензия на 100 рабочих мест — 360 000. 1С: Предприятие 8.3 ПРОФ. Лицензия на сервер — 86 400. И тут важны не конкретные цифры, а то, что решение стоит на порядок (!) дешевле платформы. Платформы, в которой, как мы выяснили, разработчику приходится делать практически все самому вручную. И если я вдруг решу написать свое решение и продавать его серийно, мне придется конкурировать с решением за 22 600 рублей. А это не так просто с учетом следующей проблемы.

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

    • Если для клиента все 1С разработчики на одно лицо, возникают ситуации, когда, например, вы разработали что-то крутое для конкретной отрасли и продаете по цене в соответствии с затратами, которые вы понесли (а рынок для конкретной отрасли узкий по определению). А вам клиент при продаже говорит: «так мне ваши конкуренты за 20к рублей 1С предлагают, вы меня обмануть хотите?». И реально покупает какое-нибудь УТ, а потом мучается с ним, потому как признавать свои ошибки люди не очень любят (а за внедрение и доработки уже заплачено).
    • Как мы видели выше, при разработке / доработке решений на 1С способов выстрелить себе в ногу огромное количество (указать условие не в параметрах виртуальной таблицы, а в блоке ГДЕ, использовать подзапрос в динамическом списке и т.п.). И клиенту, купившему решение на 1С, при доработке которого какой-нибудь не самый грамотный разработчик изрядно накосячил, потом очень тяжело объяснить, что это не «1С тормозит», а тормозит конкретное решение на 1С.

    Понятно, что уровень IT-грамотности в бизнесе постепенно растет. Люди учатся отличать платформы от решений и уделять больше внимания компаниям, у которых они покупают решение, а не самим решениям. Но 1С своей политикой сам очень сильно препятствует этому процессу, и разработчикам на 1С это должно быть как минимум обидно. Хотя, возможно, у людей, привыкших к платной документации, пониженный болевой порог.

    Заключение


    Итак, подводя итог, посчитаем, от чего 1С отказались:

    • ORM
    • SQL:
      • Расширенных возможностей
      • Оптимизатора
      • Блокировок
    • Единого control flow
    • Единой логики работы с данными на форме
    • Синхронности
    • WYSIWYG

    Полагаю, такими темпами они в следующих версиях откажутся от условных переходов и перейдут на goto. И назовут их управляемыми переходами. Кстати, с этой «управляемостью» у них весьма оригинальная манипуляция получилась. По хорошему управляемые приложение, формы и блокировки должны были бы называться ручными, но тогда это звучало бы как недостаток. А так они назвали их управляемыми и вуаля — теперь это возможность. Почему, например, производители машин с ручной коробкой передач до такого трюка до сих пор не додумались — непонятно.

    Конечно, некоторые скажут, что отказ от всех вышеперечисленных вещей — это неизбежное зло, необходимое для обеспечения масштабируемости. И если бы я не знал, что это неправда, то не писал бы эту статью. Но, например, в том же lsFusion всех описанных разделений, ограничений и других проблем нет, а при этом он спокойно работает с терабайтными базами, тысячами одновременных пользователей и очень непростым функционалом. Плюс все это дело крутится на весьма бюджетных серверах и с использованием бесплатных СУБД и ОС.

    Но ладно, что разработчики 1С отказываются от возможностей, свойственных высокоуровневым платформам, так они при этом и возможности языков общего назначения (такие, как явная типизация, наследование и лямбды) не добавляют. То есть берут самое худшее от обоих подходов, оставляя за бортом самое лучшее. Гениально, я считаю. И как со всем этим они собираются выходить на англоязычный рынок, где у них не будет их двух главных преимуществ: армии разработчиков и поддержки местного законодательства в типовых решениях, для меня загадка. Благо на рынке IT деньги решают далеко не все, иначе в мире (в том числе и в России) ничего кроме Oracle, SAP и Microsoft не существовало бы.

    Понятно, что самому 1С на качество платформы в общем-то наплевать. У них такие бюджеты на разработку типовых решений, что они могут их хоть на ассемблере писать. Конечно, дорабатывать такие решения — занятие не самое простое и приятное, но, как говорится, «проблемы индейцев шерифа не волнуют». А вот зачем 1С в качестве платформы разработки выбирают разработчики отраслевых решений, а также ИТ-директора для создания решений внутренней автоматизации (так называемые «самописки») — это, конечно, загадка. Черт с ним с lsFusion, он только пару месяцев назад на рынок вышел, но любая из связок .Net+MSSQL или Python+PostgreSQL будет уж точно не хуже. При этом не надо будет мучаться с ключами защиты, и платить лицензии за платформу, которая местами не то что не помогает, а наоборот мешает. Все ради одной реально полезной абстракции — регистры (которая легко реализуется как средствами СУБД, так и средствами того же .Net) и сомнительной пользы визуального программирования? Причем с конечными клиентами все более-менее понятно: на постсоветском пространстве для многих из них покупка программы — это приблизительно тоже самое, что и покупка мебели в офис. Но решение о создании отраслевых решений и самописок принимают люди с большим опытом в IT. Они-то чем думают? Впрочем, как говорил Эйнштейн, есть две бесконечные вещи, и ими, видимо, все и объясняется.

    В конце статьи хотелось бы обратиться к разработчикам Axapta и SAP. Дело в том, что мы сейчас готовим материалы для выхода на англоязычный рынок (где про 1С никто и не знает), поэтому нам желательно знать, как со всеми вышеперечисленными проблемами дела обстоят у местных, не скажу что лидеров, но, скажем так, самых известных продуктов на рынке. Соответственно, если кому не лень, просьба поделиться этой информацией в комментариях. Мы, конечно, изучим все эти продукты, насколько это возможно, самостоятельно, но хотелось бы узнать необходимую нам информацию, так сказать, из первых рук (а найти специалистов по Axapta и SAP на постсоветском пространстве гораздо тяжелее, чем по 1С).
    lsFusion
    67,23
    Не очередной язык программирования
    Поделиться публикацией

    Похожие публикации

    Комментарии 1751

      +13
      Хороший вброс, годный.
        +5
        Не моя тема, но все равно встряну. Знаете, что самое забавное. Я на хабре долгое время был с неполноценным аккаунтом (то есть read only). Но в принципе меня это не смущало, я оставлял комменты — разные критические и наоборот. И их всегда одобряли. Всегда кроме одного случая. Когда я в статье самого 1С спросил, а зачем они разделяли сервер и клиент (ну с пояснениями в стиле этой статьи). Его просто завернули. Видимо их такие мелкие проблемы не волнуют, ну или не барское это дело отвечать на такие вопросы.
          +1

          У платформы 1С действительно есть недостатки, но есть и преимущества, которые перевешивают недостатки.
          ИМХО 1С-ный ОРМ покрывает около 95-97% типичных учетных задач, автоматизацией которых занимаются "автоматизаторы"! финансового и управленческого учета.


          С 1С ковыряюсь с 2002 года и мне очень редко было необходимо работать в обход 1С-ного ОРМ, непосредственно с SQL-сервером. Создать 3-4 вьюва исключительно для ускорения работы или заполнить прямыми запросами новый регистр.
          А достаточно мощный механизм внешних компонент и работа с OLE/COM объектами из встроенного языка способны покрыть все остальные нетипичные задачи.
          Ну а огромнейший каталог готовых решений — очень экономит время. Ну, вы и сами знаете. :)
          ПС. полезно смотреть на продукт глазами стороннего от 1С человека, можно понять, что ты пропустил.
          ПС2. Время — один из ценнейших ресурсов разработчика сейчас. И с его экономией 1С справляется на твердую четверку с плюсом.

            0

            Кстати, с тех пор как 1С отвергла идею внедрить в 1С конфигуратор наработки Орефкова по снегопату/openconf-у(1), я к 1С-у отношусь как к типичным барыгам, не более того.


            (1) Это что-то наподобие визуал-асиста для MS VS студии.

              0
              Да понимаю тебя, сам не могу понять как сообщество терпит, видно вместо того чтобы сказать об этом — сообщесто прогресивных решило так — «а давайте мы сделаем работу 1с и назовём это опен соуросом», смешно получается.
                0
                но снегопаду отдельный респект — никогда не сдаваться.
              –39
              Ох да, автор прекрасен. Забайтил на регу на хурбербере.
              Такой некомпетентности в подобных вбросах я ещё не всетрчал.
              Например про «Неэффективное получение данных объектов» или про «Отсутствие ограничений и событий для значений регистров» — это прекрасно, автор.
              А ещё это: «В параметрах виртуальных таблиц можно использовать только константы».
              Господи, я понимаю почему 1С заминает подобные темы, потому что за такое количество времени людей просто достало отвечать вот на подобные «гав».
              Ну это правда смешно)
              И если бы в других статьях хотелось бы ещё поспорить или указать на неточность в понимании ПРОБЛЕМЫ автором, то тут просто эпик. Это реферат, видимо) Просто уникальное НЕПОНИМАНИЕ матчасти вами же так глубоко ненавистной 1С)
              Поднял настроение с утра, спасибо, знающий человек))
                +11
                Очень конструктивный комментарий. Спасибо.

                Если вы уж говорите о некомпетентности, так напишите что конкретно не так. А так на истерику больше похоже.
                  –35
                  Знаете, автор, ваше творение просто не выдерживает критики. Я понимаю, что на вашем сайте ваше решение содержит одни + в зеленых квадратиках, на фоне других платформ, но просто из интереса, пообщались бы с 1С разработчиком, прежде чем вбрасывать ЭТО и сидеть тут и жать Ф5, в поисках одобрения людей, которые видя что либо плохое в сторону 1С сразу ляпнут лукас)
                    +3
                    Вы наверное на мисте 6 частей (по 1000 сообщений) обсуждений пропустили. Конечно на мисте называть что-то обсуждениями — очень сильно ей льстить. Хотя определенный шарм в таких срачах все же есть (как с семечками или черешней, тяжело остановиться когда уже начал). Собственно много пунктов из обсуждений на мисте и пришло.
                      +13
                      Странное ощущение — что именно то не выдерживает критики? Я опытный разработчик 1С и могу подтвердить что всё что тут перечисленно большая боль для меня — и самое больное что 1С совсем не собирается что то сделать полезное, всё что она может это изолироваться и поддерживать клуб любителей такой изоляции.
                        0
                        Я со всем согласен кроме части про блокировки и СКД.

                        На самом деле управляемые блокировки достаточно удобны и в друхе времени.
                        СКД тоже не имеет аналогов. Возможно позиционирование у него и правда не до конца выверено, но продвинутым пользователям очень нравится.

                        У меня есть опыт работы с BI (особенно с MS BI) и могу сказать что пользователи вообще не могут работать с BI системами, они слишком сложны для них.
                        Если я им дашборды создам то да, они могут, где то могут поля перетянуть, но на этом все.

                        В то же время совсем нулевые девочки из ЗУП которые даже компьютер сами выключить не могут, активно используют отчеты на СКД (конечно обернутые в более дружественный интерфейс).
                          0
                          На самом деле управляемые блокировки достаточно удобны и в друхе времени.

                          А что в них удобного? По сути нужно в голове все race condition держать, что очень сложная задача. Repeatable read с прозрачными материализациями и / или FOR UPDATE в ограничениях куда проще и удобнее.

                          А СКД — да, как такой «BI для бедных» может и имеет смысл. Но а) настройки в ним такие же примитивные как в BI — то есть группировка по полям, поля по прямым ссылкам (никаких регистров) и формулы, б) они нагружают оперативную базу, в) визуализация (например цветовая) там гораздо хуже чем в большинстве BI Tools.

                          Да и с точки зрения UX Еще->Изменить Вариант на порядок уступает тому же Imply.

                          Но это если мы говорим про пользовательские настройки. Как конструктор отчетов он не сильно лучше и не сильно хуже стандартных Crystal/Fast/Jasper и т.п. Собственно неудивительно что его аналога в мире никто и не делал, потому как непонятно зачем.
                      0
                      Формулировки автора выше резковаты, но рациональное зерно содержат: добрая половина ваших «претензий к 1С» подразумевает ответ «учи матчасть!».
                        +1
                        Приведите пример где конкретно нужно «учить матчасть».
                          +4
                          Да вот самое начало:

                          Никаких one-to-many, many-to-many отображений нет, их функцию выполняют так называемые табличные части — коллекции внутренних объектов, фактически агрегированных в основной объект.
                          Давайте на уровне таблиц: что по-вашему является тру one-to-many, и сравним с тем представлением данных на уровне СУБД, что есть в 1С? Обсудим плюсы и минусы вашего подхода.

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

                          Непонятно что хочет сказать автор, что любой запрос читает объект целиком? Так это не так: все динамические списки и запросы отчетов читаются ровно по тому списку полей, который задаст разработчик (выбранные программистом для отображения, плюс выбранные программистом же неотображаемые). Если же говорить про форму объекта, то да, тут объект (строка таблицы) читается целиком, но на то это и форма объекта, чтобы читать объект целиком (назовите хоть один кейс, когда это не нужно и приводит к существенному оверхеду — тогда это будет предметный разговор).

                          Такая убогость механизма ORM в 1С на самом деле обусловлена тем, что в 1С в какой-то момент попросту решили отказаться от ORM и сделать ставку на голый SQL (то есть регистры и запросы).
                          Не защищаю 1С, но в чем конкретно заключается убогость? Что значит отказаться от ORM? Её в 1С нет? Она реализована частично? 1С разучилась работать с не-MSSQL? Какой такой голый SQL и где его можно в 1С пощупать? О чем речь вообще?

                          Правда, немного забегая вперед, с учетом отсутствия расширенных возможностей SQL и DML в 1С периодически все-таки возвращаются к ORM, но это скорее вынужденная необходимость. А в целом типичный код типовых решений на 1С выглядит приблизительно так:
                          А вот это как О_о «периодически возвращается к ORM»? Тут уже автор смешал в кучу платформу и транслируемый код прикладного решения, который может быть хоть трижды рукожопым, к механизмам платформы отношения не имеет, т.к. пишется конкретным программистом.

                          Это только опусы первого абзаца, дальше мотивации к чтению у себя пока не нашел)
                            +1
                            One to many это когда вы можете любую таблицу по полю замаппить в коллекцию любого объекта по полю. В 1с это можно сделать в очень частных случаях.

                            Про чтение, если вы обратитесь к объекту по ссылке (как это принято в orm) он считается целиком (с табличными частями). Я ссылку в статье давал.

                            Убогость заключается в том что нет инструментов борьбы с проблемой N+1.

                            Голый sql это все эти ВЫБРАТЬ ИЗ СОЕДИНЕНИЕ, которые по сути тот же самый SQL но на русском.

                            Возвращается к ORM — то есть считывают объекты и обращаются к ним по ссылкам, в циклах и т.п.

                            ЗЫ: с телефона не очень удобно отвечать, чуть позже отвечу подробнее.
                              0
                              One to many это когда вы можете любую таблицу по полю замаппить в коллекцию любого объекта по полю. В 1с это можно сделать в очень частных случаях.

                              Критерии отбора не подойдут?
                                0
                                Какое отношение они к ORM имеют?
                                +2
                                One to many это когда вы можете любую таблицу по полю замаппить в коллекцию любого объекта по полю. В 1с это можно сделать в очень частных случаях.
                                А можно прикладной неабстрактный пример такой потребности в терминах бизнес-логики, для понимания? Чтобы не обсуждать сферического коня в вакууме.

                                Про чтение, если вы обратитесь к объекту по ссылке (как это принято в orm) он считается целиком (с табличными частями). Я ссылку в статье давал.
                                Если я, опять же, пишу запрос по документам/регистрам/whatever, и джойню что-то к основной таблице по ссылке, никакие лишние реквизиты не считаются. Или тогда уж определите, что в данном случае считаем «обращением по ссылке». Синтаксическая конструкция «Ссылка.*»? Так по приведенной вами же статье написано, как это можно при желании обойти (запросом). Другое дело, что нужно и имеет смысл это довольно не часто, т.ч. если у нас есть монструозный документ с огромными ТЧ, ну делаем тогда запросом. В подавляющем же большинстве обычных кейсов, это избыточно.

                                Убогость заключается в том что нет инструментов борьбы с проблемой N+1.
                                Приведу вашу же цитату:
                                если в цикле надо обращаться к другим объектам по ссылке, мы получаем классическую проблему N+1 (один запрос для получения N объектов и по одному запросу для каждой ссылки).
                                Что мешает дёрнуть все нужные реквизиты в первом же запросе, не формируя по одному запросу для каждой ссылки? Обойдемся ровно одним запросом.

                                Голый sql это все эти ВЫБРАТЬ ИЗ СОЕДИНЕНИЕ, которые по сути тот же самый SQL но на русском.
                                Это вкусовщина. А вот приведите хороший, годный ORM с более простым синтаксисом, чем этот? Работал я на SQLAlchemy — вот где ад и израиль, для не очень примитивных запросов приходилось перерывать их документацию чуть менее, чем полностью (и иногда в итоге скатываясь к конструкциям, которые поддерживаются только конкретным движком). А тут пиши себе на SQL-like языке, который платформа сама транслирует в нужный диалект. По мне так это удобно и колоссально снижает порог вхождения. Но если у вас есть примеры более удобных подходов — с удовольствием ознакомлюсь.
                                  0
                                  А можно прикладной неабстрактный пример такой потребности в терминах бизнес-логики, для понимания? Чтобы не обсуждать сферического коня в вакууме.


                                  Вообще, если вы заметили это не в проблемах было, а именно в описании как это в 1С сделано. Я сам, если честно против классического ORM, но раз в 1С его решили поддерживать, то делали бы это нормально. А так ни рыба, ни мясо получилось.
                                  Что мешает дёрнуть все нужные реквизиты в первом же запросе, не формируя по одному запросу для каждой ссылки? Обойдемся ровно одним запросом.

                                  Потому как это уже не ORM по сути.
                                  Это вкусовщина. А вот приведите хороший, годный ORM с более простым синтаксисом, чем этот? Работал я на SQLAlchemy — вот где ад и израиль, для не очень примитивных запросов приходилось перерывать их документацию чуть менее, чем полностью (и иногда в итоге скатываясь к конструкциям, которые поддерживаются только конкретным движком). А тут пиши себе на SQL-like языке, который платформа сама транслирует в нужный диалект. По мне так это удобно и колоссально снижает порог вхождения. Но если у вас есть примеры более удобных подходов — с удовольствием ознакомлюсь.

                                  Не понимаю, чем свой диалект снижает порог вхождения. Скорее наоборот.

                                  Про более удобные подходы позабавило. Тут нас одна половина обвиняет в ангажированности, а вторые искренне удивляются, что мы предлагаем взамен. Более удобный подход — оставить объекты и сделать более декларативный и высокоуровневый язык чем SQL без инкапсуляции (не на таблицах а на функциях). И с кучей других возможностей.
                                    0
                                    Я сам, если честно против классического ORM, но раз в 1С его решили поддерживать, то делали бы это нормально. А так ни рыба, ни мясо получилось

                                    Ну… 1С вообще-то и не говорят что у них ORM (https://habr.com/ru/company/1c/blog/334050/)
                                      +2
                                      Да это эпичная статья, наглядно показывающая, какая каша в голове у них творится, и собственно почему у них такое количество текущих и избыточных абстракций.

                                      Хотя на самом деле, у них просто обе парадигмы поддерживаются и обе убого. О чем собственно и написано в обсуждаемой статье.
                                        0
                                        Ну, это ваше мнение, спорить с ним смысла не вижу.
                                        Удобство, убогость и т.п. это все-таки вкусовщина.

                                        Желаю вам найти заинтересованных в вашей платформе клиентов и разработчиков.
                                      –1
                                      Не понимаю, чем свой диалект снижает порог вхождения. Скорее наоборот.
                                      Я исхожу из предпосылки, что язык SQL программисту уже известен. И тогда (пример на SQLAlchemy)
                                      session.query(func.date(func.from_unixtime(t1.time_since_epoch)).label('date'),\
                                          t1.userId,\
                                          t1.http_url.label('host'),\
                                          func.sum(t1.http_reply_size).label('traffic')).\
                                      filter(t1.http_status_code.like('2%')).\
                                      group_by(func.date(func.from_unixtime(t1.time_since_epoch)),\
                                          t1.userId,\
                                          t1.http_url).\
                                      having(func.sum(t1.http_reply_size) > 0)

                                      воспринимается намного менее прозрачно, чем
                                      ВЫБРАТЬ ПЕРВЫЕ 100 РАЗРЕШЕННЫЕ
                                          Продажи.Клиент,
                                          Продажи.Менеджер
                                      ИЗ
                                          РегистрНакопления.Продажи КАК Продажи
                                          СОЕДИНЕНИЕ Документ.Продажа КАК Продажа
                                              ПО Продажи.Регистратор = Продажа.Ссылка
                                      ГДЕ
                                          Продажи.Период >= &НачалоПериода
                                          И Продажи.Период <= &КонецПериода
                                      УПОРЯДОЧИТЬ ПО
                                          Продажи.Период

                                      Ну или то же самое напишите в английском синтаксисе, кому-то будет ещё проще.

                                      Про более удобные подходы позабавило. Тут нас одна половина обвиняет в ангажированности, а вторые искренне удивляются, что мы предлагаем взамен. Более удобный подход — оставить объекты и сделать более декларативный и высокоуровневый язык чем SQL без инкапсуляции (не на таблицах а на функциях). И с кучей других возможностей.

                                      А можно на уровне идеи как это должно работать? (или rbymnt ссылкой). Вот честно интересно. Сабжевый ORM'ный «более высокоуровневый язык на функциях» всё равно движку придется в конечном итоге превращать в конечные запросы MSSQL, Postgre и Ко, иначе как без этого дёрнуть данные из базы. Как процедурный язык с произвольным кодом превратить в эффективный SQL-запрос? (а не в соответствующую неэффективную лапшу на каком-нибудь T-SQL под капотом с курсорами и подзапросами в циклах).
                                      У 1Сников то всё просто: отрезали все расширения разных диалектах, и почти один-в-один транслируют свой суррогатный язык запросов в запросы движков, местами добавляя постобработки в виде СКД. Далеко не супер гибко, зато достаточно эффективно (в рамках ограничений, налагаемых «кроссдвижковостью» конечно).
                                        0
                                        воспринимается намного менее прозрачно, чем

                                        Ну вы тут немного лукавите, взяли разные по сложности запросы, переводы строк добавили, ну и т.п. Вы с HQL hibernate'ским лучше сравните.
                                        А можно на уровне идеи как это должно работать? (или rbymnt ссылкой). Вот честно интересно. Сабжевый ORM'ный «более высокоуровневый язык на функциях» всё равно движку придется в конечном итоге превращать в конечные запросы MSSQL, Postgre и Ко, иначе как без этого дёрнуть данные из базы. Как процедурный язык с произвольным кодом превратить в эффективный SQL-запрос? (а не в соответствующую неэффективную лапшу на каком-нибудь T-SQL под капотом с курсорами и подзапросами в циклах).

                                        Ну вот так например. Но вообще можете в блоге посмотреть статьи. Что касается эффективности запросов, то можете статью «Почему не SQL?» почитать, чтобы понимать какого класса оптимизации делаются в том же lsFusion.
                                        У 1Сников то всё просто: отрезали все расширения разных диалектах, и почти один-в-один транслируют свой суррогатный язык запросов в запросы движков, местами добавляя постобработки в виде СКД. Далеко не супер гибко, зато достаточно эффективно (в рамках ограничений, налагаемых «кроссдвижковостью» конечно).

                                        Ну в 1С как раз все по старинке императивно. Такой ПХП с парой высокоуровневых абстракций и визуальным программированием.
                                      0
                                      А можно прикладной неабстрактный пример такой потребности в терминах бизнес-логики, для понимания? Чтобы не обсуждать сферического коня в вакууме.

                                      Могу привести реальный пример.

                                      Конфигурация «Деньги» — очень маленькая и простая конфигурация для домашней бухгалтерии. Есть документ Расход, куда построчно можно вводить данные чека, например. Данные вводятся в табличную часть. Конфа позволяет для каждой строки табличной части задать произвольное количество аналитик. То есть, в строке табличной части может быть просто «статья расхода, сумма, количество», а может быть «статья расхода, сумма, количество, проект, финансовая цель, важность,…, на что хватит фантазии». То есть в строке табличной части произвольное количество столбцов.

                                      Как это реализовано. В строке хранится ссылка на справочник «Пакеты аналитик статей». В справочнике нет реквизитов, только табличная часть с ссылками на аналитику и их значениями. При сохранении документа Расход система ищет в этом справочнике элемент с таким же набором аналитик и значений как в табличной части, и если не находит, создаёт новый элемент справочника.

                                      Оно работает, но реализацию вряд ли можно назвать красивой. Вместо того, чтобы сделать «табличную часть строки табличной части», пришлось создавать избыточный объект-справочник, который в интерфейс не выводится и содержит кучу ненужного для такой задачи функционала. Плюс хранится как отдельный объект и программисту нужно отдельно продумывать создание, поиск и удаление, разворачивание данных в столбцы и сворачивание обратно.

                                      Это костыль, но по другому сделать не получается. Хранение каких-то сложных параметров в справочниках, чтобы ссылку на элемент справочника записать в регистр или табличную часть — вполне обычное явление.
                                        0
                                        Оно работает, но реализацию вряд ли можно назвать красивой. Вместо того, чтобы сделать «табличную часть строки табличной части», пришлось создавать избыточный объект-справочник, который в интерфейс не выводится и содержит кучу ненужного для такой задачи функционала. Плюс хранится как отдельный объект и программисту нужно отдельно продумывать создание, поиск и удаление, разворачивание данных в столбцы и сворачивание обратно.

                                        Это костыль, но по другому сделать не получается.

                                        Создайте вторую табличную часть, которая и будет содержать строки табличной части строк первой ТЧ, со связкой по идентификатору строки. Не сказать чтоб супер идеально, но и не настолько костыльно, как в описанной выше реализации, жить можно. Реализация синхронизации строк двух ТЧ тривиальна. И нет внешнего объекта хранения данных, с которым нужно синхронизироваться.
                                          0
                                          Ну да, можно и по другому. Ещё можно сделать регистр и хранить данные в нём. Кстати, несколько табличных частей не получится создать в регистрах. Но всё это не отменяет факта того, что тривиальная задача для СУБД выливается в «изобретательство».

                                          Вышеописанное — не моё изобретение. «Деньги» — конфа, которая пишется «разработчиками 1с».

                                          Я бы не отказался от возможности создавать «табличную часть» для любого реквизита. Ещё очень не хватает возможности создавать функции в записях структуры (хотя бы записывать ссылки на функции) — можно было бы накостылить аналог ООП.

                                          Но вообще, вы просили пример, я его привёл. Нерешаемых задач нет — в крайнем случае можно всё хранить в xml в хранилище значения (кстати так поступают/ли с контактными данными в типовых конфигурациях, если мне не изменяет память). Но, имхо, ограничения платформы зачастую мешают, и часто спотыкаешься, если не пилишь стандартную систему количественного учёта чего-нибудь.
                                      0
                                      Про чтение, если вы обратитесь к объекту по ссылке (как это принято в orm) он считается целиком (с табличными частями). Я ссылку в статье давал.

                                      Предвзято лукавите. А как на счёт этого
                                      Однако запрос будет выполнять считывание из базы данных при каждом вызове. Соответственно, при многократном обращении к одним и тем же данным будет выполняться многократное считывание. Этого можно избежать, обращаясь к свойствам ссылки. В этом случае используется кэширование объектов и в определенном интервале времени при повторном обращении к данным объекта не будет выполняться повторное считывание

                                      its.1c.ru/db/metod8dev/content/2717/hdoc
                                        0
                                        И как кэширование меняет факт того, что он считается целиком с табличными частями? И главное вы же понимаете, что кэширование помогает только при повторном обращении в одном вызове к одним и тем же данным (что далеко не главная проблема).
                                          0
                                          Если большинство данных нужно будет использовать несколько раз за вызов, то логично получить все объект через ссылку и чтобы он закэшировался. Если нужно всего несколько реквизитов объектов (объекта), то можно воспользоваться запросом. Но обычно через ссылку данные получают только для изменения, для чтения пользуются запросом
                                            0
                                            Вы же понимаете насколько более неудобным и многословным код делает использование такого подхода с чтением через запросы? Да, в 1с по другому никак, но это не значит что это хорошо и удобно.
                                              0
                                              А теперь давайте рассмотрим ваш вариант. Обращаемся к одному реквизиту объекта, платформа неявно считывает только этот реквизит, всё чётко. Потом обращаемся к другому, снова идет обращение к базе, считывая другой реквизит. Потом может идти третий, четверный и т.д. (в 1С крайне редко идет работа с одним-единственным реквизитом). По итогу можем получить уйму подкапотных запросов, которые по оверхеду далеко опередят чтение объекта целиком за раз.
                                                0
                                                Я ниже с ходу предложил костыльное решение https://habr.com/ru/company/lsfusion/blog/468415/#comment_20703549
                                                А если хорошенько подумать можно и гораздо менее костыльное придумать используя анализ кода для оптимизаций. Просто то что я предложил — не должно быть сложно реализуемым в платформе, другие решения, более удобные и красивые, могут оказаться гораздо сложнее а то и нереализуемыми если оставить язык 1с.
                                                  0
                                                  Нет, не так. lsFusion все сама соберет в один запрос и одним запросом все считает. Но даже если не получится, кэширование в виде всяких shared buffers уже есть в самой СУБД. То есть по факту, если вы два раза считаете одни и те же данные ничего страшного. Если конечно вам при этом все равно надо считывать другие данные, и количество запросов будет минимальным.

                                                  И вообще, работа с данными на сервере приложений, это в принципе зло и убийство производительности (он для этого не предназначен).
                                          0
                                          чуть позже отвечу подробнее


                                          На мой взгляд не нужно отвечать.
                                          Суть в том что у тех кто способен понять о чем вы пишите вопросов не возникает, может быть есть в каких то моментах иной взгляд, но в целом (особенно в части про СУБД) так все и есть.

                                          А те кто начинают с этим спорить, не смогут вас понять все равно.
                                      +7
                                      И, естественно, настоящие 1С-программисты не будут снисходить до уровня простого Java/SQL-разработчика, чтобы пояснить, какую именно матчасть учить, и в чем он ошибается. Ах да — у 1С же документация платная, и бесплатно никто ничего пояснять не будет. Это же не в стиле 1С экосистемы.
                                        0

                                        Вас обманули. "1С: Предприятие 8.3. Версия для обучения программированию" можно получить бесплатно по первой ссылке в гугле указав е-mail и какие-то регистрационные данные. В комплекте кроме документации еще и книжки какие-то были. Ну и бухгалтерия типовая вроде бы в качестве решения.

                                          0
                                          Это не та документация, увы. Тоже в свое время будучи 1сником разочаровался что с доступом к документации беда без ИТС.
                                            0
                                            Если говорить об ИТС, то сравнивать платность документации 1С и какого-нибудь С# или Golang не вполне корректно. Можно ведь сравнивать её и с платностью документации какого-нибудь SAP и MS Dynamics. В большинстве случаев у подобных решений документация есть на уровне желтых книжек 1С про синтаксис и основы администрирования, доков уровня портала ИТС просто не существует. А ценник подписки ИТС, если и довольно дорог для личного самообучения, для организации со штатом хотя бы в одного программиста это просто даром (с учетом того, что ИТС это не только доки, а еще и все обновления, консультации и проч.).
                                              +1
                                              Эээ. У MS Dynamics как раз вроде как бесплатная документация. Я там много чего находил.

                                              Microsoft в последнее время вообще радует своей открытостью во всем.
                                                +1
                                                Потому что это практически единственный их шанс выжить. Иначе никому не нужна будет их документация и проще будет забыть про майкрософт, чем покупать документацию. Были бы они на коне как раньше, была бы такая же платная документация и прочее. А сейчас для них это вопрос жизни, потому и открыты.
                                                  0
                                                  Майкрософт еще не скоро умрет — это не вопрос жизни и смерти для них. И речь идет не только об открытости документации, а также об их недавнем повороте в сторону линукса и сообщества в целом.
                                                    +1
                                                    Если бы не повернулись, это было бы началом ихнего конца.
                                                +1
                                                Замечу: Желтые книжки про синтаксис — по сути «распечатанный» синтакс-помощник, который поставляется вместе с платформой.
                                                Для «личного самообучения» есть Версия для обучения программированию, которую можно вообще скачать бесплатно.
                                                  0
                                                  По синтаксису там только часть книг. Есть еще руководства администратора, руководство по серверу, руководства по прикладным решениям и еще куча какой-то макулатуры.
                                                0

                                                В смысле не та? Там руководство разработчика, руководство администратора, книжка про начало программирования в 1с. Что вы еще желаете там увидеть? У ИТС-техно объем документации в точности такой. Но за деньги. )

                                                  +1
                                                  Ну человека в начале этой ветки послали матчасть учить, т.е. правильные 1сные практики (вроде тех что на спеце по платформе проверяются), работу с БСП и какими то стандартными решениями и прочее. Ну и кстати, если заказывать коробку — это не бесплатно (там все эти руководства и Радченко). Если заказывать в электронном виде — там этого нет (не было когда я это делал по крайней мере).
                                                0
                                                А почему у меня вот по этой ссылке дает только демо-доступ на 7 дней?

                                                Назовите мне еще хоть одну вменяемую технологию, где документация за деньги (причем еще и по подписке)?
                                                  +1

                                                  Вы все-таки скачайте версию для обучения. Вам дадут пожизненный доступ на сайт ИТС для обновления и к документации для разработчиков.


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

                                                    0
                                                    Разве уже дают? У меня этого доступа нет, хотя версию для обучения даже коробку покупал, только к обновлениям платформы и совсем базовой документации. Может что покупал 5 лет назад а не сейчас…
                                                      +1
                                                      Вы все-таки скачайте версию для обучения. Вам дадут пожизненный доступ на сайт ИТС для обновления и к документации для разработчиков.

                                                      Я скачал. Мне не дали. Что я сделал не так?
                                                        0

                                                        Я не знаю. Мне когда-то дали. Документацию-то в поставку положили?

                                                      +1
                                                      Потому что в ИТС документация это очень малая часть того что там есть, основное назначение итс — обзор изменения законодательства и как это поддерживается в 1с, т.е. по сути некий аналог консультант+
                                                        0
                                                        Там и технологический раздел есть
                                                    0
                                                    Ах да — у 1С же документация платная, и бесплатно никто ничего пояснять не будет. Это же не в стиле 1С экосистемы.

                                                    You're welcome:
                                                    https://toster.ru/tag/1с/questions — 1310 вопросов, 59% решено
                                                    https://toster.ru/tag/1с-предприятие/questions — 503 вопроса, 57% решено.
                                                    Но это для тех, кто случайно сталкивается с 1С. Более глубокие вопросы бесплатно прорабатываются на инфостарте.
                                                      +4
                                                      В том, что у 1C есть большое коммьюнити и Q&A ресурсы, никто не сомневается. (1310 вопросов — это, правда, как-то мелковато для того количества программистов и того времени, которое существует платформа). На ru.stackoverflow, например, есть еще 3-4 сотни вопросов. Вот только это ни разу не документация. По Q&A вряд ли получится что-то с нуля изучить.
                                                        0
                                                        DAleby претензия же была к тому, что никто не помогает? Помогают!

                                                        Согласен, что глупо изучать работу с платформой 1С по форумам и чатам. Для этого есть документация! Можно бесплатно и официально скачать учебную платформу, общую документацию, популярные конфигурации и книги Радченка с Хрусталевой — online.1c.ru/catalog/free/18610119
                                              0
                                              Интересно, а Бухгалтерия и УПП есть на lsFusion? я бы сравнил
                                                +1

                                                Знания автора об 1с поверхностные. И устарели.

                                                  0
                                                  Я когда-нибудь устану такие комменты одобрять. Но потом же будут говорить цензура.

                                                  Слушаю и ваши комментарии. Что, где, по какому пункту не так?
                                                –14
                                                А так, у меня два вопроса к авторам, просьба ответить честно:
                                                1. Для кого написана эта статья?
                                                2. Для чего написана эта статья?
                                                  +10
                                                  Для того же для чего пишут все статьи на хабре. Рассказать про проблемы технологий (в данном случае конкретной технологии) и способы их решения. Как для 1С разработчиков, так и для других разработчиков бизнес-приложений и вообще бэкендов (чтобы они знали «как там у них», да и проблемы у них во многом могут быть схожие).
                                                    –9
                                                    И, совершенно случайно, в корпоративном блоге компании, не имеющей никакого отношения к критикуемой технологии? Спасибо за честный ответ.
                                                      0
                                                      А Вы видели как Ауди с БМВ троллили друг друга в рекламе? Было достаточно забавно и никакого особо негатива. Сторонним наблюдателям было интересно.
                                                        0
                                                        Ну как бы весовые категории в данном случае несколько, скажем так, различные. Я как раз и пытался узнать, для кого они эту рекламу написали, но не судьба, видимо.
                                                          +7
                                                          Например, когда у кого-то, кто конкурирует с 1С, будут спрашивать, а чем плох 1С, то ему смогут давать ссылку на эту статью.
                                                            0
                                                            Если только конкурируют платформы для разработки, а не готовые решения. Я, правда, слабо представляю подобную конкуренцию между 1С и lsfusion, ниши практически не пересекающиеся.
                                                              0
                                                              Тут речь не только про lsFusion идет. Если у меня написано на .Net, а у кого-то на 1С, то можно говорить, что там хуже, так как строится на слабой платформе (по крайней мере, с точки зрения маркетинга). Все же понимают, что дом построенный на плохом фундаменте будет хуже, чем тот, который построен на хорошем.
                                                                0
                                                                Сравнивать будут решения по функциональности и качеству решения проблем бизнеса, в первую очередь, стоимости доработки и сопровождения во вторую.
                                                                Если же брать разработку с нуля — lsfusion надо тогда сравнивать с .Net, CUBA, odoo. 1С больше про готовые решения, а не про платформу.
                                                                  0
                                                                  Вы не поверите, на 1С много отраслевых и самописок с нуля пишут. О чем собственно и сказано в статье.
                                                                    0
                                                                    Так отраслёвки пишут обычно франчи 1С, часто как нашлёпки на типовые от 1С, на чём же ещё их писать франчам? С нуля от независимых разработчиков знаю только про WMS системы, и отдельные редкие случаи, вроде Деловых линий.
                                                                      +1
                                                                      А я очень много знаю. Более того в Беларуси основной игрок на рынке бухгалтерии (!) свою конфигурацию с нуля писал. Ну или на рынке FMCG розницы (где Астор например тоже с нуля свою конфу делает).

                                                                      И вообще у чуть более крупных клиентов самописок на 1С более чем достаточно.
                                                                        0
                                                                        Не знаю как у вас там, в Беларуси, а в России самописки на 1С у крупняка обычно получаются в результате многолетней доработки изначально типовой 1С, которая происходила параллельно с ростом бизнеса. Чтобы так осмысленно взять, и в крупной компании абсолютно с нуля писать своё на 1С — это очень большая редкость. Астор, опять же, тоже скорее всего из франчей/отдела 1С-ников вышел, так что ниразу не показатель.
                                                                          +1
                                                                          Вы видимо в обсуждении на мисте не учавствовали. Вы же понимаете, что к примеру УТ или ERP для FMCG розницы (да и не FMCG) не подходит никак (там половины нужных модулей нет). И допилить УТ до нужного состояния это все равно что из танка самолет сделать. Особенно с учетом убогости возможностей рефакторинга в платформе. И Астор с нуля писал, не понимаю почему не показатель.
                                                                            0
                                                                            Писал Астор с нуля на 1С потому, что уже имел штат специалистов по 1С, а не потому, что осознанно выбрал эту платформу. То, что типовые от 1С — далеко не идеал, спорить не буду, это мне вполне очевидно.
                                                                              0
                                                                              Астор — образовывался как 1с-ный франч :)
                                                                                0
                                                                                Ну, что и требовалось доказать :)
                                                                                0
                                                                                Помню ту конфу для розничной торговли (Модный магазин), их первая попытка перейти на 8-ю платформу. Долго они пытались нам её внедрить, всё время хотели, чтобы мы переделали свои бизнес-процессы под их алгоритмы. В результате год потерянного времени и куча денег в никуда. Потом перешли на самописку на основе типовой Розницы.
                                                                                  0
                                                                                  >> То, что типовые от 1С — далеко не идеал
                                                                                  А мне нравятся больше, чем крутые поделки на других языках, в т.ч. и на 1С. Просто если множество факторов собрать в кучу, то типовые, увы, выигрывают.
                                                                                    0
                                                                                    Нравится <> Идеал. То, что могло быть намного хуже — согласен. Но могло быть и намного лучше :)
                                                                                      0
                                                                                      Пока лучше не придумали для российских реалий, это всё просто фантастика. Нет, конечно же по отдельному критерию (как фьюженцы пытаются) 1С-ка проиграет от и до, но в целом ей просто нет равных в мире. Именно совокупность цены, универсальности, удобство восприятия, кормление студентов и мощнейшая база по методологии выводит стандартные решения от 1С на очень высокий уровень
                                                                                        0
                                                                                        Как платформа 1С проигрывает всем на рынке. Даже SAP. Причем практически по всем пунктам. Но раз ей нет равных в мире, посмотрим как ей удастся выйти на англоязычный рынок без существующих разработчиков, и поддержки перемудреного местного законодательства. Шляпу готовы съесть, если в течении 5 лет они даже 0.01% мирового рынка не займут?
                                                                                          0
                                                                                          Как платформа 1С проигрывает всем на рынке. Даже SAP. Причем практически по всем пунктам.


                                                                                          Рынок считает иначе и голосует рублем сами знаете за кого — в 1С несут денежки и сторонним программистам, занимющимся 1С.
                                                                                          SAP, кстати, тоже та еще шляпа со своими проблемами. Напрасно вы ее как пример лучшего решения приводите.

                                                                                            0
                                                                                            Рынок не считает иначе. Просто 1С оказался в нужное время в нужном месте. А в таком случае можно даже с очень плохой платформой захватить большую долю рынка. Вот если им удастся занять хоть какую то значимую долю на мировом рынке с нуля (пусть и с их теперешними ресурсами) тогда да, можно будет говорить, что «в целом ей просто нет равных в мире». А пока это просто мелкий локальный игрок.
                                                                                              –1
                                                                                              а нам и в России хорошо…
                                                                                              а тут 1С уделывает всех…

                                                                                              а по поводу мирового рынка, на родине SAP не так давно дойчебанк С ГОРДОСТЬЮ ХВАСТАЛСЯ о том что у них появился андроидпэй… эпл пей пока нет но вот андроидпэй появился…

                                                                                              так что заливать про мировой рынок не надо…
                                                                                                +1

                                                                                                Вы так говорите, как будто функционирование androidpay и applepay это заслуга 1С.

                                                                                                  –1
                                                                                                  я так говорю в пример того что «мировой опыт» зачастую где то там далеко отстает от российского… как например в сфере распространения бесконтактных платежей…

                                                                                                  вроде — родина SAP — а телефоном расплатиться в метро или где-нибудь там в палатке покупая мороженку — нельзя… технологии то не позволяют…
                                                                                                    0
                                                                                                    я так говорю в пример того что «мировой опыт» зачастую где то там далеко отстает от российского…

                                                                                                    Особенно в разработке ПО, да.

                                                                                                      0
                                                                                                      мой пример был приведен в качестве того что безапелляционно и закрыв глаза повторять что «мировой опыт всегда на шаг впереди российского» — по крайней мере не верно…

                                                                                                      а по поводу разработки отраслевого ПО — ну вот пример 1С… есть аналогичные системы с подобным сбалансированным функционалом, стоимостью, порогом вхождения, поддержкой нац/законодательств на западе?
                                                                                                        0
                                                                                                        безапелляционно и закрыв глаза повторять что «мировой опыт всегда на шаг впереди российского»

                                                                                                        А кто это говорил?


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

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


                                                                                                        И как минимум в США как минимум для SMB на этом рынке весьма жесткая драка.

                                                                                                          –1
                                                                                                          А кто это говорил?


                                                                                                          таков контекст беседы…

                                                                                                          Не могу сравнить их функциональность и порог вхождения с 1С, конечно же, но кого это волнует


                                                                                                          однако то что 1С ну просто никак не может быть более продвинутым и качественным продуктом чем некие западные решения вы не сомневаетесь…
                                                                                                            0
                                                                                                            таков контекст беседы…

                                                                                                            Это вы его себе таким придумали. Если хочется сражаться с пугалом — сколько угодно, но без меня.


                                                                                                            однако то что 1С ну просто никак не может быть более продвинутым и качественным продуктом чем некие западные решения вы не сомневаетесь…

                                                                                                            Скорее наоборот: я пока не вижу оснований считать, что 1С — это более продвинутый и качественный продукт, чем (нужное вписать).

                                                                                                              –1
                                                                                                              Это вы его себе таким придумали. Если хочется сражаться с пугалом — сколько угодно, но без меня.


                                                                                                              а я и не вам отвечал…

                                                                                                              Скорее наоборот: я пока не вижу оснований считать, что 1С — это более продвинутый и качественный продукт, чем (нужное вписать).


                                                                                                              не видите — не считайте.
                                                                                                                0
                                                                                                                не видите — не считайте

                                                                                                                Тогда в чем смысл вопроса "есть аналогичные системы [...] на западе?"

                                                                                                      0
                                                                                                      У них это по другой причине сложилось. Там где прежде не было вообще никаких технологий, новые технологии ложатся как масло на хлеб. А там где работают старые технологии, новые часто конфликтуют и поэтому их внедрение затормаживается и требует серьёзного пинка чтобы пропихнуть. В конце концов, другие страны можно использовать как полигон для масштабной натурной обкатки технологий и выявление её слабых мест.
                                                                                                  0
                                                                                                  Рынок не считает иначе. Просто 1С оказался в нужное время в нужном месте.
                                                                                                  А как считает рынок?
                                                                                                    0
                                                                                                    Он никак не считает. Он ест, что дают.

                                                                                                    И 1С не лучше всего остального, просто остальное, что существовало на рынке, не сильно лучше, того что предлагал / предлагает 1С. Поэтому не смогло его подвинуть, равно как и наоборот.
                                                                                                      0
                                                                                                      Он никак не считает. Он ест, что дают.

                                                                                                      И почему же тогда приходится напрягаться, что-то выдумывать? А чё попало рынок почему-то не хавает.

                                                                                                        0
                                                                                                        Рынок всегда ест то, что первое успело заскочить на рынок с MVP и/или попав в массовую нишу (бухгалтерию например). А дальше на этом рынке его в состоянии подвинуть, только что-то фундаментально лучше (чем альтернативы 1С не являются, явно как и 1С не лучше своих текущих альтернатив).
                                                                                                          0
                                                                                                          ну как бы 1С не первая заскочила на рынок… она выдавила с него многих и многих… и продолжает выдавливать…
                                                                                                        0
                                                                                                        остальное, что существовало на рынке, не сильно лучше, того что предлагал / предлагает 1С
                                                                                                        А можете привести пример? В тот же ценник и с сопоставимым функционалом?

                                                                                                        Рынок всегда ест то, что первое успело заскочить на рынок с MVP и/или попав в массовую нишу (бухгалтерию например).
                                                                                                        Nokia, Yahoo, Blackberry, IBM, Novell, ICQ и мн. др. на этой фразе, должно быть, прослезились.
                                                                                                      –1
                                                                                                      Просто 1С оказался в нужное время в нужном месте.

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

                                                                                                      Вот если им удастся занять хоть какую то значимую долю на мировом рынке с нуля

                                                                                                      Пффффф! Кто даст? Вы серьёзно считаете, что самые активные воры мира пустят 1С? А как они будут кормить своих детишек? Нет, они без боя никогда не сдадутся. Они будут тужиться-пыжиться, но не сдадутся. Они уже сколько раз пытались перенять концепцию 1С и каждый раз обгаживались с позором, ибо ориентируются на кодерство и стабильность в бизнес-процессах.
                                                                                          0
                                                                                          … это все равно что из танка самолет сделать

                                                                                          Ох, как всё это знакомо.
                                                                                        0
                                                                                        1. Если знаете много и пишут с нуля значит есть смысл.
                                                                                        2. Если разговор про конфигурацию от Хьюменсистем. То это не пример нормальной/качественной разработки, а пример «впаривания» продукта. В которой ресурсов на защиту потрачено больше чем на бизнес функционал.
                                                                                        У меня сложилось впечатление что автор многие вещи пересказывает «со слов»
                                                                                    0
                                                                                    Но в конце автор и задается вопросом почему платформу 1с выбирают для разработки новых решений, вместо выбора более удобных вещей. У меня честно говоря только одно предположение — бренд и сеть франчайзи которая допилит в любой деревне за копейки новую колонку в отчет.
                                                                                      0
                                                                                      Так кто выбирает то, приведите примеры?
                                                                                        +1
                                                                                        Например компания в которой я работал пишут «Итилиум», «1С: ТОИР», «1С:RCM». Но то ладно, то уже черт знает сколько лет франч (хотя для мобильных приложений их никто не заставлял 1с выбирать, наверно, отношения с вендором не очень хорошо знаю).
                                                                                        А так, сколько на инфостарте статей про новые «нетленки»? Иногда даже от частных лиц. Внутренние проекты иногда начинают на 1с, хотя даже не планируют во вне выпускать, но тут наверно по наличию ресурсов выбирают, какие программисты есть под рукой, те и пишут.
                                                                                        0
                                                                                        Ну вы же понимаете, что код как в статье допиливать — это мягко говоря не каждому под силу. Тем более в деревне. Мне стремно в него лезть, боясь что где-то что-то упадет, а уж франчу…

                                                                                        Собственно на том же рынке FMCG розницы в Астор даже компании со своим штатом 1С программистов боятся лезть (не то что франчи).
                                                                                          0
                                                                                          Ну вы же понимаете, что код как в статье допиливать — это мягко говоря не каждому под силу. Тем более в деревне. Мне стремно в него лезть, боясь что где-то что-то упадет, а уж франчу…

                                                                                          Именно по этому качеству ваша система сливает 1С вчистую.
                                                                                          Уж что-что, а программисты по 1С как раз сыщатся влегкую.
                                                                                          Но не те, кто станет разбераться в вашей системе.

                                                                                          Собственно на том же рынке FMCG розницы в Астор даже компании со своим штатом 1С программистов боятся лезть (не то что франчи).


                                                                                          Да ладно, боятся.
                                                                                          Может, просто потому что нужно работать на том рынке, что ты хорошо знаешь и который тебе и приносит хорошее бабло?

                                                                                          Это как Боинг стал бы автомобили строить. Тоже интересный рынок. Но не его. Они на самолетах специализируются.

                                                                                          0
                                                                                          >> бренд и сеть франчайзи которая допилит в любой деревне за копейки новую колонку в отчет.
                                                                                          Это малая часть так-то. В основном дело в том, что 1С просто заточена под решение задач, а не реализации крутого кода. И да, в 1С всё на русском можно писать.
                                                                                          Смотрите, есть проблема с резервированием изменённых файлов. Типа, изменённые складывались что бы в папку отдельную. Мелочная штука, но капец как её не хватает на всех предприятиях, где я бывал. В т.ч. и дома! Готовый софт разношёрстный, но капец какой нестабильный и как правило привязан то к ОС, то к точке нет, то к бухлу разработчика. В общем первые три версии писал на асме. Выкидывал в итоге, потому что ОС меняется, API меняется и прочее. Проще переписать, чем разобраться в километрах асмового кода.
                                                                                          Потом писал на PureBasic-е. и через какое-то время упирался в те же грабли — винда обновилась, всё отвалилось, в своём же коде разбираться просто лень.
                                                                                          Итог какой? Правильно! 1С!!! Хоть через 10 лет залазишь и можешь тут же всё доработать. Платформа идеально поддерживает тренд изменения ОС и стоит и на работе и дома. Понимаете? Я этого не хотел, но так или иначе всё равно пришёл к 1С. Она по всем описанным факторам просто выгоднее.
                                                                                            0
                                                                                            Ну вы еще бы в машинных кодах писали вместо того чтобы взять java, .net, python и подобное.
                                                                                              0
                                                                                              Т.е. точка нет круче 1С, потому что имеет более низкий уровень и круче ассемблера, потому что имеет гораздо выше уровень? Хм… позиция из разряда «я весь в белом, а вы в грязи».
                                                                                              Но смысл был не про это, а именно про цену создания и поддержания этой идеи. Цена — основной двигатель автоматизации! Не крутость среды разработки или кода, а именно цена. На точке нет, например, цена будет гораздо выше, чем на 1С из-за обновлений виндовс, установки новой среды разработки и абсолютной нечитаемости кода через какое-то время. Это применимо именно ко мне! Например, для плюсовика самое дешёвое будет писать такую утилиту как раз на сях
                                                                                                0
                                                                                                C# лучше потому что язык статически типизированный с ООП и нотками функциональщины. А не потому что кто то более выскоуровневый кто то менее. Да и что это за параметр «крутость»? Важно удобство, скорость решения задач, сложность поддержки и развития и прочее.
                                                                                                  0
                                                                                                  C# лучше потому что язык статически типизированный с ООП и нотками функциональщины.


                                                                                                  Лучше вообще?
                                                                                                  Или, все же, лучше для задач, в которых используется 1С?

                                                                                                  Понимаете в чем дело:

                                                                                                  Если вы возьметесь реализовывать учетную систему для бизнеса с C# прямо сейчас, то, конечно, кода будет значительно больше на тех же задачах, для которых предназначена 1С.

                                                                                                  Ведь язык 1С управляет объектами, предоставленными ему платформой.

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

                                                                                                  Понимаете, в чем дело:

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

                                                                                                    0
                                                                                                    Наложите любой современный язык на 1с — и увидите как резко растет производительность (можно с опциональной типизацией вроде typescript, python). Плюсы ООП и статической типизации не в выразительности для написания сложных алгоритмов (что бы под этим не подразумевалось), а в возможности повышать уровень абстракции (ооп) и делать это относительно безопасно и с минимумом ошибок (статическая типизация, контракты, интерфейсы). Плюс поддержка такого кода легче так как снижается количество ошибок и не нужно в голове держать нижележащие слои при реализации бизнес логики.
                                                                                                    И что за крутость? Что это за параметр такой?
                                                                                                      0
                                                                                                      Плюсы ООП и статической типизации не в выразительности для написания сложных алгоритмов (что бы под этим не подразумевалось), а в возможности повышать уровень абстракции (ооп)


                                                                                                      Это одно и то же.

                                                                                                      Вот только значительная часть абстракций в 1С вынесена за пределы самого языка, реализована в платформе.

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


                                                                                                      Да, все правильно.

                                                                                                      Видимо, и плюсы динамической типизации вам известны тоже?

                                                                                                      Ну а теперь назовите плюсы динамической типизации и наложите их на задачи в 1С — и вам все станет ясно.

                                                                                                        0
                                                                                                        Вот только значительная часть абстракций в 1С вынесена за пределы самого языка, реализована в платформе.

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


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


                                                                                                          «Значительная часть в платформе» != «Все подряд в платформе».

                                                                                                          Функционал того, что вы называете БСП, не такой уж и навороченный, что только за ради его следовало бы вводить дополнительные механизмы работы с абстракциями.

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

                                                                                                          Ну а те, кто разрабатывают типовые конфигурации — переживут. Основные деньги делаются не благодаря им.

                                                                                                          А только потому, что 1С легко под себя подправить на месте — потому бизнес ставит себе 1С и уверен, что если что понадобится он легко и просто под себя подгонит. Этим занимаются программиста «на местах». Вот для этой основой массы программистов и не нужно усложнять работу.
                                                                                                            0
                                                                                                            Еще раз, не ради БСП, а ради того что мы строим над своими данными и логикой а так же бсп. Ну и какой нибудь пайтон не сильно сложнее 1с (если в дебри не лезть).
                                                                                                              0
                                                                                                              Ну и какой нибудь пайтон не сильно сложнее 1с (если в дебри не лезть).


                                                                                                              Об этом и речь.
                                                                                                              Сложнее всего осваиваются новичками базовые абстрации языков программирования.

                                                                                                              А затем уже идут сравнительно легко усваиваемые различия. Исключений среди распространенных языков программирования, что основаны на совсем другой парадигме — немного.

                                                                                                              Поэтому изучение другого языка для сложившегося программиста даже рядом не похоже на эту проблему для начинающего.
                                                                                                                0
                                                                                                                Вот не сказал бы. Можно ли назвать начинающими программистами людей которые по 5-7 лет на 1с пишут? А для них даже java или пайтон освоить гораздо сложнее чем программисту на C# например. Знаю немало примеров. Просто другие концепции часто применяются в современных промышленных языках которые к 1с неприменимы из за отсутствия ООП того же.
                                                                                                                А вот писать на питоне в стиле 1с, но с добавлением типов в аргументы — мне кажется любой 1сник за пару дней осилит.
                                                                                                    0
                                                                                                    ООП не ускоряет разработку, а делает код круче. Не более того. Поймите, на 1С из готовых кубиков собираешь нужное тебе приложение, а на сях (любых) программируешь алгоритмы. Это совсем разные вещи. Например, резервирование файлов, о котором писал выше, отняло у меня 195.21 минуту чистого времени. И это не поделка читающая настройки из текстовых файлов, а полноценная учётная система с протоколированиями, механизмами по принятию решений и кучей полезных фишек. Конечно, в методологии создания таких систем я не силён и ориентировался только на личный опыт и функционал поделок от других разработчиков. Но поймите, 3.25 часа это копейки по сравнению, например, с PureBasic-ом, на котором ушло несколько месяцев на создание и допиливание такого же функционала.
                                                                                                    Сразу отмечу, что на скриптах подобное можно быстрее реализовать, но функционал будет беднее и любой чих — писанина в блокноте.
                                                                                                    Примечание: делал похожее и на пакетных файлах
                                                                                                      0
                                                                                                      делает код круче

                                                                                                      Да нет такого понятия в коммерческой разработке. Есть лишь критерии для оценки эффективности. ООП, особенно если добавить элементы ФП — позволяет писать код более эффективно, с меньшим количеством ошибок. Да, на 1с быстрее наваять поделие из за довольно широкой стандартной библиотеки — но развивать и поддерживать его — та еще боль. Это вам кажется что все дураки и выбирают инструменты рабочие по их крутости, да, такое тоже бывает когда выбирают чисто из личных предпочтений, но это исключение из правил. Инструменты выбирают исходя из их эффективности для решения задач.

                                                                                                      З.Ы. А если отходить от коммерческой разработки — я бы тыкал c/c++, rust, haskell — но в коммерческую разработку я даже не думаю их тащить, потому что с коммерческой точки зрения на тех задачах которые я решаю они не эффективны. Эффективны языки вроде js (ух как я его ненавижу), dart (эффективность пониженная из за малой распространенности разработчиков и потому трудной заменяемости одного разработчика другим), c#, java, kotlin, python, даже php современный насколько слышал сейчас сделали более по человечески и подходящим для разработки крупных проектов.
                                                                                                        0
                                                                                                        Поймите, на 1С из готовых кубиков собираешь нужное тебе приложение


                                                                                                        Я что-то пропустил? Все готовые решения это огромные медленные монолиты. А с нуля разрабатывать на ТАКОЙ платформе (со всеми вышеобозначенными проблемами) это самоубийство.
                                                                                              +1
                                                                                              Сравнение сложных IT-систем (в частности, ERP) очень больная тема. Все описанные в статье проблемы имеют прямое отношение к стоимости доработки и сопровождения. Или Вы считаете, что все современные подходы к разработке направлены не на это, а просто на то, чтобы потешить эго разработчиков?
                                                                                                0
                                                                                                Имеют, конечно, в общем. Но если есть готовое решение для производства от 1С, и нет такого от lsfusion, например, — не имеют, в частности :))
                                                                                                  0
                                                                                                  Это статья не про lsFusion, а про 1С. Возможно будет еще и про то, как это сделано в lsFusion. И выше я писал, что если речь идет о производстве на 1С и другой технологии, то эта статья помогает понять, как минимум, что плохо в фундаменте той, что на 1С.
                                                                                                    0
                                                                                                    Так ведь нет ничего другого в РФ за такие деньги, вот в чём проблема. Я и пытаюсь объяснить, что не конкурируете вы с 1С никак на уровне платформы.
                                                                                                      0
                                                                                                      Как минимум, lsFusion — это альтернатива для разработки так называемых «нетиповых» решений. О чем, например, указано в статье.
                                                                                                        0
                                                                                                        Ну да, альтернатива. Только не для 1С. Вы сильно преувеличиваете значение нетиповой разработки с нуля на платформе 1С в настоящее время.
                                                                                                          +1
                                                                                                          Вся суть статьи в том, что у платформы 1С много проблем. Давайте не будем скатываться в обсуждение рынка бизнес-приложений и типовых конфигураций. То, что в США на COBOL'е работает куча крупных компаний, автоматически не делает COBOL классной платформой для разработки приложений.
                                                                                                            0
                                                                                                            Да, у 1С много проблем. Но почему это так волнует lsfusion?
                                                                                                              +1
                                                                                                              Даю подсказку. Открываем список статей в блоге компании lsfusion. Смотрим количество плюсов и комментариев в статьях с критикой 1С и SQL, сравниваем с количеством авторов публикаций в блоге. Потом смотрим количество комментариев и плюсов в статьях без критики 1С и SQL (последние штуки 3-4), тоже сравниваем с числом авторов статей в блоге. Делаем выводы.
                                                                                                                0
                                                                                                                «Возможности ничего не стоят, без проблем которые они решают.» © будем считать мой.
                                                                                      +16
                                                                                      «Совпадение, не думаю».

                                                                                      Давайте так, это Хабр. Если с каким то пунктом вы не согласны, отлично, дайте развернутый комментарий, покажите что автор не прав (вы же понимаете что многие на Хабр ради комментариев заходят). И тогда все поймут что это просто «маркетинговый бред», «автор просто не разбирается» и все в таком духе.
                                                                                        –10
                                                                                        Нет, я получил честные ответы ответы на все свои вопросы, дальнейшая дискуссия смысла не имеет.
                                                                                          +4
                                                                                          КонецДискуссии
                                                                                      0
                                                                                      В статье рассказывается система со стороны кодера и совсем никаким боком не затрагивается область бизнес-приложений. В том-то и проблема, что это трындец какие разные вещи. С одной стороны бизнесмену всё равно какой крутой или кривой код, ему то всё видится только в виде бизнес-объектов, тогда как с другой стороны, идёт измерение крутости кода
                                                                                        0
                                                                                        В статье рассказывается система со стороны кодера и совсем никаким боком не затрагивается область бизнес-приложений. В том-то и проблема, что это трындец какие разные вещи. С одной стороны бизнесмену всё равно какой крутой или кривой код, ему то всё видится только в виде бизнес-объектов, тогда как с другой стороны, идёт измерение крутости кода


                                                                                        Все правильно пишите.

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

                                                                                        Но здесь это не так.

                                                                                        Авторы ссылаются на опыт глубоко подкапотачный вещей типа PostgreSQL vs Oracle.
                                                                                        Но там действуют другие правила.
                                                                                          +1
                                                                                          В статье рассказывается система со стороны кодера и совсем никаким боком не затрагивается область бизнес-приложений.

                                                                                          Издеваетесь? Как раз основной посыл статьи, что вместо того, чтобы фокусироваться на бизнес-задачах разработчику 1С приходится заниматься всякой ерундой, вроде ручных блокировок, директив компиляции, callback'ов, ЗначениеВРеквизитФормы, связыванием списков и реквизитов и т.п.
                                                                                            0
                                                                                            в 1С больше инструментарий, а вы это преподносите как минус…
                                                                                            Да — в вашем мире и в вашей области автоматизации эти инструменты избыточны и ненужны… но ваше решение с 1С практически нигде не пересекается, по этому по сути вы еще не очень доросли до этих инструментов.

                                                                                            Ну не нужна вам асинхронность и управление серверными вызовами — да… вы просто не сталкивались с такими бизнес-задачами… а 1С сталкивался в полный рост…

                                                                                            это не делает 1С хуже — это делает 1С универсальнее и сложнее.

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

                                                                                            monosnap.com/file/ORhXPM24Lg4tmcFPob8Qs92cTY12XJ

                                                                                            сколько вы времени потратите и вообще сможете эту бизнес-задачу реализовать?
                                                                                              0
                                                                                              Да на фьюжене пока форму нарисуешь, уже забудешь её назначение. А если сначала ещё и регистры к ней описывать, тогда надо отдельное ТЗ писать с подписями и прочей бюрократией.
                                                                                              Мало того, я писал про то, что в статье не затрагивается то, что нужно покупателям — бизнес-логика! Нет этого у фьюжен!
                                                                                              Вспомните с каким лозунгом 1С зашла на рынок: «своевременная сдача отчётности». Не крутость кода или алгоримтов, а с тем, что нужно покупателям!
                                                                                                0
                                                                                                Как раз основной посыл статьи, что вместо того, чтобы фокусироваться на бизнес-задачах разработчику 1С приходится заниматься всякой ерундой, вроде ручных блокировок, директив компиляции, callback'ов, ЗначениеВРеквизитФормы, связыванием списков и реквизитов и т.п.

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

                                                                                                И, у 1С все это было автоматом — 2/3 того, что вы перечислили — это сравнительно поздние нововведения. Раньше и без них было — да прям как у вас.

                                                                                                Однако, оказлось, что чем более разноплановых задач ставят перед 1С — тем более разнообразные инструменты полезнее.

                                                                                                Ваше восприятие таковым кажется, потому как вы не имеете достаточно опыта с той системой, что критикуете.

                                                                                                Это нормальное восприятие любой новой системы. Ваша система — тоже не исключением будет, ежели кто соберется на нее перейти — людей ждет такой же батхерт при входе в новую для себя технологию, что и у вас возник с 1С.
                                                                                                  0
                                                                                                  Раньше и без них было — да прям как у вас.

                                                                                                  Нет не как у нас. Раньше все (а точнее большинство) на клиенте было и автоматически блокировалось кучу лишних данных. Что не масштабируемо. А в lsFusion все масштабируемо — все на сервере приложений, прозрачные материализации и update conflict'ы из коробки и т.п.
                                                                                                  Однако, оказлось, что чем более разноплановых задач ставят перед 1С — тем более разнообразные инструменты полезнее.

                                                                                                  Нет, у них возникли проблемы с масштабируемостью, а не разноплановые задачи.
                                                                                                    0
                                                                                                    Нет, у них возникли проблемы с масштабируемостью, а не разноплановые задачи.


                                                                                                    Зачем делать функционал, пока в нем не возникло потребности?

                                                                                                    Это одно и то же:

                                                                                                    1. Ранее использовалось с небольшими базами данных и для них и создавалось. К чему там лишние сложности для разработчиков, когда автоматика платформы справлялась.
                                                                                                    2. Возникала задача использовать с большими базами данных — она же проблема масштабирования.


                                                                                                    Вы о чем вообще спорите?
                                                                                                    О том, что есть 2 способа блокировок на выбор прикладного программиста (автоматический и ручной) и это плохо?

                                                                                                      0
                                                                                                      О том, что получилось два механизма. Один простой, но не работающий. Второй сложный но работающий. Почему не сделать один простой и работающий (то есть чтобы «автоматика платформы справлялась»).
                                                                                                        0
                                                                                                        Один простой, но не работающий

                                                                                                        Кто вам сказал-то что он неработающий? Те, кто не умеют их готовить? Гы.

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

                                                                                                          0
                                                                                                          Кто вам сказал-то что он неработающий? Те, кто не умеют их готовить? Гы.

                                                                                                          Речь шла не только про блокировки, а и про ОФ, про ОткрытьФормуМодально и т.п. Но даже касательно автоматических / ручных блокировок. Вы в курсе что в 1С автоматические блокировки ВСЮ таблицу в PostgreSQL блокируют, а в MS SQL на сложной логике и большом количестве пользователей у вас эскалации через раз будут, после чего база тоже в клинч начнет входить.
                                                                                          0
                                                                                          del
                                                                                            0

                                                                                            Ах тыж, на святое покусился

                                                                                              0
                                                                                              А у вас есть свои интеграторы/внедренцы?
                                                                                              Ну просто демо-продукт на сайте он совсем… Ущербный…
                                                                                              Что-то более похожее на реальную жизнь увидеть бы.
                                                                                                0
                                                                                                Вы про эту демку? (но там только часть функционала, можете кликнуть на модули посмотреть, что именно там сделано)

                                                                                                Это рыба, на которой впрочем работает большое количество предприятий >= 4к сотрудников, причем все модули от производства, до автозаказов (кроме бухгалтерии, HR и фронта).
                                                                                                +2
                                                                                                логика объектов напоминает обычный ORM, правда, со своими особенностями:

                                                                                                Никаких one-to-many, many-to-many отображений нет, их функцию выполняют так называемые табличные части — коллекции внутренних объектов, фактически агрегированных в основной объект.

                                                                                                Подчиненный справочник с владельцем и есть классическое one-to-many
                                                                                                  0
                                                                                                  Ну это все равно не совсем классический one-to-many, потому как, как я понимаю, работает между двумя одинаковыми типами (справочник-справочник), скажем справочник с регистром или документом вы так не свяжете. Но да про них, я что-то забыл, точнее про подчиненные справочники у меня был отдельный пункт, но потом исчез, а в другие не дописал. Сейчас попробую немного изменить статью.
                                                                                                    0

                                                                                                    Почему один объект справочника, на который ссылаются 1000000 записей регистра остатков и 1000000 записей документа, который породил эти записи регистра, это не one-to-many?

                                                                                                      –1
                                                                                                      Потому, что это many-to-one :))
                                                                                                        0
                                                                                                        Вы из справочника через точку можете написать что-то вроде: Товар.ДокументыПрихода[10].Дата?
                                                                                                          0
                                                                                                          А где так можно писать, и какой документ нужно считать 10-м?
                                                                                                            0
                                                                                                            Ну почти во всех ORM. Например в Java указываете OneToMany и @JoinColumn для List и у вас будет коллекция с документами. В данном случае будет рандомный документ, хотя вроде можно порядок указывать в таком маппинге. Но 10 это я для примера написал. Пусть будет «FOR Товар.ДокументыПрихода».