В различных бизнес-приложениях часто возникает задача по вводу документов. Обычно документ состоит из заголовка и некоторых строк, каждая из которых ссылается на некоторый объект (например, товар). Чаще всего, для ввода записей в документ используется обычная таблица, в которой пользователь может добавлять и удалять строки, а также изменять их содержимое.
Однако, в некоторых случаях, такая схема не всегда удобна для пользователей. В этой статье я расскажу, как можно строить удобный пользовательский интерфейс при помощи техники подбора товаров.
Задача
Как правило, при вводе документов для пользователя существует ограничение по набору объектов, которые могут быть в него добавлены. В этом случае, логично пользователю показывать список таких объектов с возможностью быстрого включения (и исключения) их в документ. В колонки, по каждому из объектов, также удобно показывать данные, необходимые для принятия решения о необходимости включения его в документ. И наконец вместе с объектом часто бывает потребность вводить его количество.
Рассмотрим три часто встречаемых в бизнес-приложениях типа документов:
- Заказ на закупку. В таких документах пользователю логично показывать список всех товаров, доступных для заказа от поставщика. В колонки удобно показывать текущий остаток, реализацию за определенный интервал, кол-во заказанного на закупку и продажу.
- Заказ на продажу. Здесь чаще всего показывается список товаров, которые есть на остатках выбранного склада и доступны для продажи выбранному клиенту. Также должны показываться текущие цены
- Изменение остатков. Это документ используется для корректировки текущих остатков в случае выявления каких-то расхождений с фактическим количеством. В подборе обычно показываются все товары, с возможностью вводить фактический остаток для любого из них. При этом в документ добавляется товар с количеством равным разнице между фактическим и текущим остатком.
Решение
Дальше я покажу как быстро и легко реализовать эту логику на базе открытой и бесплатной платформы lsFusion. В качестве примера создадим логику по вводу заказа на закупку.
Для начала добавим справочник товаров через стандартный CRUD интерфейс:
CLASS Product 'Товар'; |
Создадим понятие поставщик, и в форме редактирования дадим возможность выбирать товары, с которыми он работает:
CLASS Supplier 'Поставщик'; |
Объявим логику заказов со строками:
CLASS Order 'Заказ'; |
Добавляем к строкам товары и количество:
product 'Товар' = DATA Product (OrderDetail); |
Переходим непосредственно к построению нужной нам формы редактирования заказа. Для начала добавляем на нее сам заказ и его строки:
FORM order 'Заказ' |
Тем самым мы получаем стандартный интерфейс по работе со строками заказа через добавление и удаление.
Дальше добавляем на эту форму нужный нам функционал подбора. Для этого сначала создаем на форме объект со списком всех товаров, в котором фильтруем только те, которые разрешены к заказу у выбранного поставщика:
EXTEND FORM order |
Настраиваем дизайн, чтобы строки заказа и подбор отображались как вкладки одного контейнера:
DESIGN order { |
Строим вспомогательные свойства для отображения и ввода пользователем количества в соответствующей колонке:
quantity 'Кол-во' (Order o, Product p) = |
Первое свойство считает для заказа и товара его количество в этом документе. Второй находит последнюю строку (пользователь может ввести несколько строк с одним товаром).
Дальше создаем действие, которое будет обрабатывать ввод пользователем значения в соответствующую колонку во вкладке подбора:
changeQuantity 'Изменить кол-во' (Order o, Product p) { |
И наконец добавляем колонку на форму, указывая действие, которое должно выполняться, когда пользователь будет пытаться менять ее значение:
EXTEND FORM order |
Осталось только нарисовать форму со списком заказов и добавить ее в навигатор:
FORM orders 'Заказы' |
Результирующая форма будет выглядеть приблизительно вот так:
Любые изменения сделанные на любой из вкладок будут автоматически отражаться на другой.
В реальных ERP-системах на форму добавляется значительно больше колонок и прочих элементов. Например, в одной из таких реализаций она выглядит следующим образом:
Посмотрим как этот функционал реализован в других бизнес-приложениях.
1С
В разных конфигурациях 1С логика подбора имеет определенные отличия, но принцип более менее одинаков. На форме редактирования документов есть кнопка Подобрать, которая вызывает диалог с выбором товара:
В этом диалоге подбирать товар можно следующим образом:
В этом механизме есть, как минимум, два неудобства.
Во-первых, для того, чтобы добавить количество товара в документ (а чаще всего пользователь уже знает количество, которое хочет добавить), нужно сначала дважды кликнуть на товар, добавив его в строки, а затем уже в строках менять количество. При этом в самом списке товаров пользователь не видит добавлен ли уже этот товар и с каким количеством. Кроме того, такая схема “сжирает” дополнительное место, так как приходится выводить две таблицы на один экран вместо одной.
Во-вторых, после того как были добавлены строки непосредственно в документ, если нажать повторно кнопку Подобрать, то подбор начнется “с чистого листа”. В нем не появится никаких строк в нижней таблице, и в момент повторного подбора не будет понятно, что уже есть в документе, а чего нет. Также это нарушает одно из важных правил при построении интерфейса: если пользователь ошибся, то ему нужно дать возможность вернутся назад и исправить ошибку. Здесь же получается, что он не сможет вернутся в подбор товара имея те же данные, что и до нажатия кнопки добавления в документ.
Впрочем, возможно в 1С можно реализовать и вышеописанную схему, но почему-то в типовых конфигурациях, которые доступны на сайте с демо-версиями используется другая.
Microsoft Dynamics 365
В качестве решения я взяла Retail (только в нем я нашла похожий функционал из доступных на https://trials.dynamics.com). В нем вызвать подбор можно на форме Purchase orders двумя способами:
Первая кнопка реализована по схеме 1С (хотя там гораздо меньше колонок), поэтому на ней останавливаться не буду.
Вторая кнопка вызывает диалог со списком товаров, где количество уже можно вводить в колонки. Но сделано это очень своеобразно.
Во-первых, по умолчанию, там показываются только коды товаров (даже без наименований). Я конечно понимаю, что можно создать расширения и включить туда еще другие колонки, но видеть такое поведение в базовой версии немного странно.
Во-вторых, в Microsoft видимо так увлеклись дизайном, что почему-то забили на нормальную обработку скроллирования данных, обработку фокусов и событий. Выглядит это приблизительно вот так:
При обычной работе клавиатурой идет постоянное переключение текущих рядов при перечитывании данных. При этом начать вводить можно только дождавшись всех обработок событий, а иначе количество либо не вводится вообще, либо вводятся не в те ряды. Как с этим работают реальные пользователи для меня остается загадкой. Видимо конкретно этим функционалом мало кто пользуется. Ну или это ограничения демоверсий, а в эксплуатации все работает хорошо.
Заключение
Описанная схема ввод документов через отдельную вкладку подбор была хорошо оценена нашими пользователями.
На практике, эта концепция может усложняться различными способами. Например, вместо списка товара выводить список артикулов с возможностью ввод разных количеств для отдельных характеристик. Или в одном из документов в строках были склады, и требовалось в колонки задавать количества для каждого из этих складов.
Такую схему можно реализовать, например, в том же React, используя в качестве состояния текущие строки документа и отображая его двумя компонентами в двух разных вкладках. Но следует помнить, что записей в таблице с товарами может быть очень много, и придется реализовывать так называемый “infinite scroll”. Кроме того, желательно добавить пользователю возможность сортировать и фильтровать товары в этом списке (причем это надо делать на сервере, а не на клиенте, чтобы не тянуть туда лишние данные). Все это становится достаточно нетривиальной задачей для разработчика.
В платформе lsFusion этот функционал реализуется из коробки и требует лишь описанный выше код. Попробовать как это работает, а при желании и модифицировать код, можно онлайн на соответствующей странице. Вот исходный код целиком, который можно вставить на вкладку Платформа и затем нажав Play:
CLASS Product 'Товар'; |
Комментарии (71)
vadikvs
21.08.2019 18:21Попробуйте сделать подбор товара как в 1с 7.7 торговля и склад. Это самый быстрый удобный побор который я видел и пользовался. Многие мои знаковые в оптовой торговле не хотят до сих пор менять 1с 7.7 на 8. именно из-за удобства быстрого подбора товара в накладную.
sergeevaira Автор
21.08.2019 18:25К сожалению, не могу найти нигде в свободном доступе механизм подбора в 7.7. Чем он принципиально отличается от того, что описан в статье? Можете сделать GIF по аналогии с теми, что в статье, или скинуть ссылку на YouTube? Там тоже можно вводить количество в колонки?
heiheshang
22.08.2019 21:13Не понятно что вашим знакомым мешает в 8-ке сделать подбор как 7.7?
NitroJunkie
23.08.2019 08:38Начнем, я полагаю, с того факта, что в 8-ке нельзя редактировать значения прямо в списке (кроме табличных частей). Речь про УФ естественно, потому как если использовать ОФ, непонятно зачем вообще с 7.7 переходить.
Собственно даже текущий подбор через одно место сделан. Делается объект обработки с табличной частью и на форму выводится именно эта табличная часть.heiheshang
23.08.2019 09:37Не совсем понятно о чем вы говорите, о списке или о таблице, но редактировать можно что там что там. Вы ничего не говорите о конфигурации, если речь о 10.3 то она не сильно от 9.2 отличается, если про УТ 11.4 то она конечно сильно отличается от 9.2, но подбор типовой работает везде сходным образом. Разница объясняется наличием возможности в 10.3 и 11.4 выписывать товар с нескольких складов в одной накладной, в 9.2 такой возможности нет.
NitroJunkie
23.08.2019 09:50Не совсем понятно о чем вы говорите, о списке или о таблице, но редактировать можно что там что там
А прокомментируйте тогда пожалуйста:
forum.mista.ru/topic.php?id=745039
forum.mista.ru/topic.php?id=791827
forum.infostart.ru/forum9/topic32107
forum-1c.ru/index.php?topic=34259.0
forum.mista.ru/topic.php?id=581751
Цитата из книги М.Г.Радченко «1С-Предприятие 8.2 — коротко о главном»:
Данные можно редактировать только в форме.
При работе в режиме управляемого приложения свойство объекта конфигурации Способ редактирования игнорируется, и данные редактируются всегда в отдельной форме.
Это относится ко всем таблицам, источником данных которых является динамический список.
Если же таблица имеет другой источник данных (табличная часть, дерево значений и т.д.), то ее данные редактируются непосредственно в списке.
Я собственно сейчас пробую в учебной версии это организовать, никак не получается. Может подскажете, как можно вытащить список товаров и сделать колонку которую можно редактировать, как в Axapta или lsFusion например.
PS: Ну и еще раз уточняю речь про УФ.heiheshang
23.08.2019 10:20Начнем с того что в 7.7 не было динамических списков, вы тогда как в 9.2 делайте, выводите форму справочника, а остатки выводите в колонку «аля вычисляемое поле». Не уверен что в Axapta или lsFusion можно просто так отредактировать значение строки полученной в результате сложного запроса, у вас поле которое вы редактируете может быть результатом вычисления по полям из нескольких таблиц и не совсем понятно куда вы будите записывать значение?
Вы не полностью раскрываете задачу, но требуете решения. В 9.2 конфиге нет возможности ввести количество в подборе в ячейке, там выскакивает модальное окно с запросом количества или количества и цены в зависимости от настроек. Вы пишите о кастомном решение для конкретного клиента.Veidt
23.08.2019 10:28Не уверен что в Axapta или lsFusion можно просто так отредактировать значение строки полученной в результате сложного запроса, у вас поле которое вы редактируете может быть результатом вычисления по полям из нескольких таблиц и не совсем понятно куда вы будите записывать значение?
Если это первичные данные (читай поле таблицы), то можно редактировать, и записываться будет в эти же данные (опять таки в поле таблицы), все из коробки. Более того можно для вычисляемого поля задать редактирование первичных данных (см. пример в статье) и форма сама автоматически обновится по окончании редактирования поля (сразу, а не после записи в базу !). Собственно посмотрите гифку подбора в lsFusion. Как такое же на 1С сделать?
В 9.2 конфиге нет возможности ввести количество в подборе в ячейке, там выскакивает модальное окно с запросом количества или количества и цены в зависимости от настроек. Вы пишите о кастомном решение для конкретного клиента.
Не совсем понял о каком кастомном решении речь идет. Обычный WYSIWYG, как в Excel, то есть видишь товары — заполняешь в колонку количество. Супер примитивный кейс.
Собственно об этом видимо и писал человек, когда говорил про 7.7.heiheshang
23.08.2019 10:30Еще раз в Типовой 9.2 нет возможности как в Excel забить количество в ячейку.
Veidt
23.08.2019 10:33Причем тут типовая? Речь о платформе. В УФ в принципе Excel-style интерфейсы строить нельзя. Только такое извращение как в статье, отдельно список товаров, отдельно строки с количеством, и добавление строк по двойному клику.
Собственно поэтому в 1С интерфейсы скажем так на любителя (речь не про дизайн, а именно про эргономику)heiheshang
23.08.2019 10:40Если вы возьмете любой регламинтированый отчет в бухгалтерии, то там как раз
Excel-style интерфейсVeidt
23.08.2019 11:03Ну речь шла все же про формы ввода (в частности подбор). Или что вы имеете ввиду под регламентированным отчетом, можете скрин скинуть?
heiheshang
23.08.2019 11:27Да речь о подборе, но как в 7.7. В 7.7 не как в Axapta или lsFusion. В 7.7 нет динамических списков, если хотите как в 7.7 то и делайте в 8-ке как в 7-ке делали, не через динамические списки.
Excel-style интерфейс это табличные документы, сделайте табличный документ, заполните его товарами и редактируйте на здоровье как в ExcelVeidt
23.08.2019 11:30Так а если товаров 100к, сервера не лягут при каждом открытии и изменении отбора заполнять таблицу значений на форме такими обьемами?
heiheshang
23.08.2019 11:34Это смотря какие у вас сервера, у меня если иерархию отключить в подборе, то как бы долго список выводится, но он у меня динамический и платформа оптимизирует вывод. Но так в лоб решать задачу все таки не стоит.
Veidt
23.08.2019 11:44Что-то я совсем запутался.
Если список динамический — то там и проблемы нет, но и вводить ничего нельзя.
Если нет — то считывая 100к товаров в таблицу значений при каждом открытии / отборе у вас любой сервер ляжет.heiheshang
23.08.2019 11:46Сервер не ляжет. Я говорю что идея считывать 100к не очень разумная идея.
Veidt
23.08.2019 11:55То есть если 100 пользователей будут каждую минуту открывать и работать с формой подбора, а ширина записи товара скажем 1кб, то одно только это будет 10гб жрать, и это только одна таблица значений. Плюс затраты на ее заполнение.
В любом случае если вы говорите, что это не очень разумная идея. Как в 1С нормально (в смысле масштабируемо) реализовать ввод «как в Excel»?heiheshang
23.08.2019 12:08Почему вы так зациклены на вводе как в Excel?
Я уже написал вам как, можете через табличный документ реализовать.
За мою 20 летнюю практику ни кто не настаивал именно на таком.Veidt
23.08.2019 12:15Почему вы так зациклены на вводе как в Excel?
Так как это WYSIWYG, то есть самый удобный и эргономичный способ. Ну реально не таким же извращением как в УТ 11 это делать.
Я уже написал вам как, можете через табличный документ реализовать.
Табличный документ это отчет. Вы предлагаете подбор через отчет делать? Серьезно? Плюс как там с отборами, сортировками и вообще куда там кнопку перенести в документ повесить?
За мою 20 летнюю практику ни кто не настаивал именно на таком.
Ну так может пользователи у вас ничего кроме 1С никогда не видели. А им там четко сказали не позволяют технические возможности и вообще дешево / у всех бухгалтерия на 1С и т.п.heiheshang
23.08.2019 12:27не совсем понимаю при чем тут WYSIWYG
«Табличный документ это отчет.» табличный документ — это не отчет — это табличный документ, если вам так важен вид как в excel, то по кнопке подбор открывайте табличный документ, а не форму справочникаVeidt
23.08.2019 12:34WYSIWYG — это означает, что я редактирую то что вижу, а вижу то что отредактировал. Без всплывающих окон, дополнительных списков и всякой такой ерунды.
Я правильно понимаю вы этот табличный документ имеете в виду:
Как в нем подбор можно сделать?heiheshang
23.08.2019 16:45Я имею в виду вот это http://v8.1c.ru/overview/Term_000000288.htm
Хотя табличные документы используются, в основном, для представления уже обработанной информации, существует возможность непосредственного ввода данных в табличный документ как в «обычную» электронную таблицу.Veidt
23.08.2019 17:04Как я понял это все равно что в Paint редактировать, никакого отношения к данным не имеет.
Может конечно есть какой-то хак — привязать это к данным, но непонятно какое отношение это имеет к тому, что мы обсуждаем.heiheshang
23.08.2019 17:08Нет вы не поняли.
Veidt
23.08.2019 17:16А можно тогда пример где табличный документ используется в качестве ввода данных в систему в виде списка? Я уже пару часов гуглю не могу найти ничего похожего.
heiheshang
23.08.2019 17:21Что вы имеете в виду под списком?
Veidt
23.08.2019 17:31
Вторая вкладка (Подбор). Там список товаров из ассортимента поставщика и туда же вводится значение.heiheshang
23.08.2019 17:43Честно говоря я не понимаю в чем у вас проблема и почему вы не можете реализовать такой вариант. Табличный документ вам для этого точно подойдет. Откройте БП 3.0 возьмите Отчет по НДС, там подобное есть, не один в один, но понять можно.
Veidt
23.08.2019 17:58Причем тут отчет? Мне отчёт на 100к товаров открывать каждый раз? Нужно как минимум чтобы только видимые данные читались, как в динамическом списке.
Ну и есть пример с кодом? А то все примеры что я видел там все руками надо делать.
heiheshang
23.08.2019 18:00Не понимаю в чем проблема повесить событие на выбор значения из поля поставщик и после этого заполнить табличный документ списком товаров поставщика? У поставщика же не будет 100К товаров
Veidt
23.08.2019 18:18То есть вы все таки понимаете о чем речь :)
Во первых очень сильно зависит от поставщика, там и пару тысяч товаров может быть. А во вторых отбор по ассортименту поставщика может быть опциональным, то есть пользователь может его выключать и видеть скажем все остатки.
Ну и таблицу значений нужно руками по сути заполнять / записывать в базу, а не просто декларативно указать, что я хочу там видеть, как в lsFusion или динамическом списке, а дальше платформа все делает сама.
heiheshang
24.08.2019 04:22Я не понимаю, вы хотите получить результат просто тыкая мышкой? Если вы хотите как lsFusion зачем вам 1С? Платформа предоставляет вам базовые возможности, пишите код повышайте уровень абстракции до приемлемого для вас и тыкайте мышкой. Напишите 1 раз будете использовать всегда.
CrushBy
23.08.2019 19:13При заказе на продажу или списании товара нужно видеть товары всех поставщиков, которые есть в наличии (а при работе под заказ вообще всех).
heiheshang
24.08.2019 04:01Это у вас наверное сидит человек и глазками просматривает номенклатуру и делает заказ, а у меня в 1С делается формирование заказа обработкой и человек корректирует и там ну ни как 100к не получается. При списании зачем вам вся номенклатура, достаточно той что списываете, можно просто в табличной части набрать первые буквы списываемого товара и список покажется уже отфильтрованый
CrushBy
24.08.2019 07:57Ясно. Понятно. Классическая аргументация 1С программиста. «У меня вот так платформа умеет, а остальное вам не надо. И так сойдет.».
Причем здесь обработка? Как вернутся в интерфейс обработки, если пользователь ошибся и заказ уже сформирован и нужно видеть опять все данные?heiheshang
24.08.2019 12:55Мне кажется вы не читаете документацию раз задаете такие вопросы. Вы деньги заплатите тому кто знает как это сделать.
Глобальный контекст (Global context) ОткрытьФорму (OpenForm) Вариант синтаксиса: По имени Синтаксис: ОткрытьФорму(<ИмяФормы>, <Параметры>, <Владелец>, <Уникальность>, <Окно>, <НавигационнаяСсылка>, <ОписаниеОповещенияОЗакрытии>, <РежимОткрытияОкна>)
В <Параметры> передайте ссылку на документ, в обработчике открытия формы обработайте свою ситуацию.
Veidt
24.08.2019 16:04Вы что под обработкой понимаете? Программный код по генерации автоматического заказа? И что там прямо и все праздники, прогноз погоды и взаимозаменяемость товаров учитываете, что пользователю прямо пару строк надо поменять, и даже не надо весь список товаров видеть?
heiheshang
24.08.2019 16:06Вы в УТ 11.4 видели блок планирования?
Veidt
24.08.2019 16:17Блок планирования продаж? Угадывающий, что закажет клиент?
heiheshang
24.08.2019 16:46Планирования закупок.
А вы каким-то образом угадываете что закажет клиент?Veidt
24.08.2019 17:01Нет, поэтому и нужны подборы с вводом в списке товаров.
heiheshang
24.08.2019 17:49А исходя из чего у вас человек принимает решение о заказе того или иного товара и в каком количестве?
Veidt
25.08.2019 08:34Исходя например из общения с человеком по телефону. Ну или например из собственных экспертных оценок. Понятно что система показывает ему реальные продажи, прогнозы продаж, предлагаемое системой количество к заказу и много чего еще, но решение часто принимает сам человек (хотя бывает когда процесс полностью автоматический, но это уже от пожеланий заказчика зависит).
heiheshang
25.08.2019 08:43По моим наблюдениям люди часто ошибаются, но к программе более пристальное внимание. Не знаю какой у вас бизнес, но в магазинах общение с торговыми представителями ведет к тому что втюхивают товар, который как раз не продается и потом гемор с его возвратом.
heiheshang
23.08.2019 12:14в Axapta или lsFusion как то по другому данные на клиента попадаю?
Veidt
23.08.2019 12:31Не совсем понял вопрос. В lsFusion данные тоже считываются видимыми порциями в результате SQL-запросов, но lsFusion умеет в этих запросах учитывать сделанные в сессии изменения и показывать данные с учетом изменений. А 1С нет.
heiheshang
23.08.2019 16:39Вы делаете не корректное утверждение что 1С так не умеет, 1С так умеет.
Veidt
23.08.2019 16:43Ну так расскажите как, а то я уже второй день бодаюсь, не могу понять как реализовать такой подбор как в lsFusion в статье.
Ta_Da
24.08.2019 13:52Вариант 1:
1) Добавляете на форму таблицу значений.
2) Пишете запрос для ее заполнения (или берете тот же, что используется в динамическом списке).
2*) Используете СКД для заполнения таблицы значений, чтобы не рисовать самому отборы и фильтры, а предоставить пользователю возможность настройки «как в динамическом списке».
3) Чтобы не грузить весь справочник целиком, по аналогии с динамическим списком, добавляете в запрос чтение данных порциями (реализуется с использованием конструкции «TOP N» ).
Вариант 2 (не подойдет для мобильного приложения):
1) Используете динамический список.
2) Передаете в него таблицу уже отобранных товаров.
3) Добавляете обработчик на выбор значения поля «Количество», который будет открывать окошко ввода количества (минус — отдельное окошко, плюс — на него можно навесить дополнительные функции типа добавления товара кратно упаковкам и т.д.)
Вариант 3 (По аналогии с регламентированной отчетностью 1С)
1) Заполняете список товаров в виде табличного документа (табличный документ можно размещать в том числе, как обычный элемент формы)
1*) Опять же — можно использовать СКД для его заполнения.
2) С помощью установки признаков разрешения или запрета редактирования конкретных полей или колонок, позволяете пользователю вносить информацию.
3) Программно считываете внесенные в табличный документ данные.
При необходимости настраиваем открытие карточек справочников/иных форм/выполнение действий при, например, двойном щелчке на конкретных ячейках табличного документа.Veidt
24.08.2019 15:59Спасибо за ответ. Собственно я так и думал, но тут мягко говоря есть ряд вопросов:
Вариант 1:
1) А что делать со скроллингом? То есть пользователь нажал pagedown, надо дочитать еще данные, что дальше делать? Еще один запрос? Но тогда туда придется достаточно сложные условия добавлять вроде Порядок1 = ТекущееЗначениеПорядка1 И Порядок2 > ТекущееЗначениеПорядка2 ИЛИ Порядок1 > ТекущееЗначениеПорядка1.
2) Непонятно что делать с измененными значениями. То есть пользователь что-то изменил в этой таблице, проскроллил вниз, проскроллил вверх он должен увидеть, то что он изменил. То есть нужно сливать ранее измененные значения со считанными. Как это поддержать?
3) Вы понимаете сколько там кода будет при этом? То что в lsFusion из коробки одной строчкой делается.
Вариант 2: Смысл то как раз в том чтобы не вызывать диалог. Но даже с диалогом не совсем понял, то есть предполагается, что надо руками хранить, что пользователь изменил, и при открытии диалога дополнительно проверять не измененные ли это данные. Плюс я так понимаю это надо как-то в запросе динамического списка учитывать (он вообще к таблицам значения обращаться умеет?), и вручную заставлять этот динамический список обновляться при изменении таблицы значений с изменениями. В любом случае вы опять-таки представляете сколько кода при этом будет? Реально интересно посмотреть пример кода, потому что в том же УТ все интерфейсы это убогие списки и диалоги. В лучшем случае как в подборе два списка в одном выбираешь, в другом вводишь.
Вариант 3:
А как его сделать динамическим, чтобы только порциями записи читались? Ну и вы же представляете какое это извращение ввод в отчете реализовывать, и там кода будет еще больше чем в первых двух вариантах.Ta_Da
24.08.2019 17:141)
Но тогда туда придется достаточно сложные условия добавлять
Условие «первые <ЧислоЭлементовНаЭкране> ИЗ (Первые <ЧислоЭлементовНаЭкране + Смещение>)».
2)Вы понимаете сколько там кода будет при этом? То что в lsFusion из коробки одной строчкой делается
Вы хотели редактирование «как в Excel» и утверждали, что на 1С это реализовать не возможно. Я предложил несколько различных вариантов реализации. Количество строк кода сравнивать смысла не вижу. Иначе я могу, например, напомнить, что какой-нить динамический список справочника в 1С можно создать без единой строчки кода и нажатий на кнопки мыши — система автоматически сгенерирует ее при обращении к справочнику.
Во-вторых, отборы/сортировки/условные оформления/поиск по подстроке доступные в динамических списках без единой строчки кода, в том числе на уровне пользователя, на lsfusion также можно реализовать с помощью 1-2 строк?
3)Непонятно что делать с измененными значениями
. Передавать таблицу значений, с зафиксированными количествами товаров в качестве параметра запроса (фактически, это может быть сама таблица на форме или ее сокращенный вариант с отбором по значению реквизита «Количество» и только необходимыми колонками ).
4)Но даже с диалогом не совсем понял, то есть предполагается, что надо руками хранить, что пользователь изменил, и при открытии диалога дополнительно проверять не измененные ли это данные. Плюс я так понимаю это надо как-то в запросе динамического списка учитывать (он вообще к таблицам значения обращаться умеет?), и вручную заставлять этот динамический список обновляться при изменении таблицы значений с изменениями
Да, придется хранить в таблице значений.
Да, фактически данные вносятся и редактируются именно в ней, после изменения — обновляются данные динамического списка (фактически — измененная таблица передается в качестве параметра списка, платформа обновить информацию автоматически).
По количеству кода уже писал выше. Нужно составлять полностью совпадающие по возможностям формы и только после этого начинать сравнивать количество строк кода, раз уж для вас это так важно.
5)А как его сделать динамическим, чтобы только порциями записи читались?
Точно также как и с таблицей значений.
6)Ну и вы же представляете какое это извращение ввод в отчете реализовывать
Понимаете, для меня тот вариант подбора, который реализован у вас, кажется извращением. Это вопрос вкусов и привычек.
Но если подходить формально — ввод данных в табличном документе, наиболее близко подходит к определению «как в Excel».Veidt
24.08.2019 17:57Условие «первые <ЧислоЭлементовНаЭкране> ИЗ (Первые <ЧислоЭлементовНаЭкране + Смещение>)».
Не понял что это значит, можно расшифровать на каком-нибудь простом примере.
утверждали, что на 1С это реализовать не возможно
Ну 1С тьюринг-полный язык на нем можно и танки реализовать теоретически. Речь шла о том, чтобы реализовать хоть сколько нибудь декларативно.
Иначе я могу, например, напомнить, что какой-нить динамический список справочника в 1С можно создать без единой строчки кода и нажатий на кнопки мыши — система автоматически сгенерирует ее при обращении к справочнику.
Во-вторых, отборы/сортировки/условные оформления/поиск по подстроке доступные в динамических списках без единой строчки кода, в том числе на уровне пользователя, на lsfusion также можно реализовать с помощью 1-2 строк?
Давайте определим, что значит без единой строчки кода. Вы же понимаете что нет никакой разницы программировать мышкой или клавиатурой. Потому как иначе я могу взять любую обучалку детей программированию и там тоже «не будет ни одной строки кода».
А вообще lsFusion умеет делать не только, то что вы говорите, но и то что 1С близко не умеет: поддерживает редактирование и автоматическое реактивное обновление формы при любом таком редактировании (без каких либо дополнительных обработчиков).
Передавать таблицу значений, с зафиксированными количествами товаров в качестве параметра запроса
Я правильно понимаю, так как там придется LEFT JOIN с этой таблицей значений, то придется вот такое извращение делать:
// Сначала выбираем переданные значения во временную // таблицу, а уже затем работаем с временной таблицей // как с обычной. Запрос = Новый Запрос( "ВЫБРАТЬ | Название, | Численность |ПОМЕСТИТЬ | ВременнаяТаблица |ИЗ | &ТаблицаСтран КАК Страны |; |ВЫБРАТЬ | Название, | Численность |ИЗ | ВременнаяТаблица |УПОРЯДОЧИТЬ ПО | Численность УБЫВ" ); Запрос.УстановитьПараметр("ТаблицаСтран", Страны);
По количеству кода уже писал выше. Нужно составлять полностью совпадающие по возможностям формы и только после этого начинать сравнивать количество строк кода, раз уж для вас это так важно.
Я снизу привел пример формы. И пытаюсь представить как такое на 1С сделать, там придется строк 100 причем весьма извращенного кода написать (прежде всего для поддержки скроллинга, хотя я до сих пор не понимаю как вы это предлагаете делать)
Точно также как и с таблицей значений.
Как также? В отчете есть событие изменение текущего ряда? Можно где-нибудь на demo-ma.1c.ru посмотреть как это работает?
Понимаете, для меня тот вариант подбора, который реализован у вас, кажется извращением. Это вопрос вкусов и привычек.
Но если подходить формально — ввод данных в табличном документе, наиболее близко подходит к определению «как в Excel»
Это обычный Excel. Вы же понимаете что большинство людей привыкло к Excel и WYSIWYG. Или вы реально считаете что подбор с двумя списками это нормально?
Но как вы правильно заметили, это вопрос вкусов и привычек. Но не ваших, а пользователя, и заставлять их работать так как умеет 1С это верх садизма (в смысле что в примере lsFusion пользователь может сам выбрать Excel или Doc style)Ta_Da
24.08.2019 19:09Не понял что это значит, можно расшифровать на каком-нибудь простом примере.
На MySQL «SELECT * FROM table LIMIT N OFFSET 0;»
У 1С нет OFFSET во встроенном языке запросов, но есть ПЕРВЫЕ (TOP), соответственно
SELECT TOP N FROM (SELECT TOP Offset+N DESC). N — число элементов на странице, Offset — смещение от начала списка.
Давайте определим, что значит без единой строчки кода. Вы же понимаете что нет никакой разницы программировать мышкой или клавиатурой.
Это значит «без единой строчки кода». Система автоматически генерирует формы карточки/списка для объектов метаданных, если разработчик не озаботился их созданием.
А вообще lsFusion умеет делать не только, то что вы говорите, но и то что 1С близко не умеет: поддерживает редактирование и автоматическое реактивное обновление формы при любом таком редактировании (без каких либо дополнительных обработчиков).
В демо примерах я вижу только возможность скрыть/показать заранее добавленные в коде колонки, поменять их заголовок и возможность простейшей фильтрации таблицы по «равно/не равно/like».
В каком демо примере можно посмотреть что-то похожее на «настройку формы» или «настройку списка» из 1С? Напоминаю, в 1С для этого не требуется написания кода/добавления обработчиков/даже мышкой ничего нажимать не нужно.
Как также? В отчете есть событие изменение текущего ряда?
Как вам уже пытались донести, «табличный документ» это не «отчет». Это компонента, если хотите, для отображения информации (да, в том числе отчетов)
Да, для табличного документа есть возможность обрабатывать события изменения данных в ячейке, активизации и выделения ячейки и т.д.
Посмотреть как это работает можно в типовой регламентированной отчетности для бухгалтерии, добавление валют из классификатора в УНФ. Любой отчет с расшифровкой, в конце концов.
Это обычный Excel.
Это не эксель. У вас нет формул, макросов, заполнения полей протаскиванием и т.д.
Вы же понимаете что большинство людей привыкло к Excel и WYSIWYG.
и заставлять их работать так как умеет 1С это верх садизма (в смысле что в примере lsFusion пользователь может сам выбрать Excel или Doc style)
Да, часть пользователей пытается все делать «как в excel», такие пользователи и у меня есть. Они же вместо нормальных отчетов просят сделать им простыни на 100 колонок и десятки тысяч строк, для того чтобы крутить их с помощью сводных таблиц и предпочитают заниматься вводом данных с помощью «Экспорт в Excel — Редактирование — Импорт в 1С».
При этом, у меня также есть пользователи, которые верхом садизма будут считать делать так, как предлагаете вы.
Увы, мир несовершенен.
Или вы реально считаете что подбор с двумя списками это нормально?
Откройте любой интернет магазин с корзиной товаров. Как ни странно — но это именно два списка с редактированием количества в отдельном окне.Veidt
24.08.2019 19:35На MySQL «SELECT * FROM table LIMIT N OFFSET 0;»
У 1С нет OFFSET во встроенном языке запросов, но есть ПЕРВЫЕ (TOP), соответственно
SELECT TOP N FROM (SELECT TOP Offset+N DESC). N — число элементов на странице, Offset — смещение от начала списка.
Во-первых OFFSET в принципе не правильно использовать потому как данные могут меняться и вы просто не попадете в ту запись на которой стояли. Во вторых при таком запросе половину СУБД (Postgres так точно), когда вы end нажмете, начнет всю таблицу сканировать.
В каком демо примере можно посмотреть что-то похожее на «настройку формы» или «настройку списка» из 1С? Напоминаю, в 1С для этого не требуется написания кода/добавления обработчиков/даже мышкой ничего нажимать не нужно.
Она телепатически догадается, что нужно добавить?
Расскажите что в «настройку формы» или «настройку списка» входит, а то я создал форму с запросом и не вижу что в нем можно что-то настраивать. Хотя если честно я даже в необходимости настройки таблицы не уверен, так как это не попадает под систему контроля версий и соответственно сильно усложняет поддержку в будущем.
В любом случае мы расширенную настройку тоже поддержим, это достаточно примитивная задача по сравнению с тем же редактированием. А вот у 1С родовая травма останется похоже навечно.
Да, для табличного документа есть возможность обрабатывать события изменения данных в ячейке, активизации и выделения ячейки и т.д.
Посмотреть как это работает можно в типовой регламентированной отчетности для бухгалтерии, добавление валют из классификатора в УНФ. Любой отчет с расшифровкой, в конце концов.
Так еще раз. Он умеет только 25 записей считать и дочитывать их по мере перемещения в ячейках. Мне именно этот кейс интересен. Можете на моем примитивно примере из 2 колонок продемонстрировать.
Увы, мир несовершенен.
Согласен поэтому платформа должна позволять и то и другое. А 1С позволяет по факту только одно.
Откройте любой интернет магазин с корзиной товаров. Как ни странно — но это именно два списка с редактированием количества в отдельном окне.
Это потому что вы в интернет магазине долго выбираете и хорошо если хотя бы 2 товара покупаете. Если вы сразу 100 позиций будете заказывать, это очень неудобно будет.
Veidt
24.08.2019 16:37То есть вопрос, какое минимальное число строчек займет такой функционал (но так чтобы это работало когда товаров 100к):
CLASS Sku; name = DATA STRING (Sku); quantity = DATA STRING (Sku); FORM skuForm OBJECTS s=Sku PROPERTIES (s) name, quantity, NEW, DELETE ; NAVIGATOR { NEW skuForm; }
Это в lsFusion создаст форму с товарами, которую можно редактировать как в Excel.
Тут можно посмотреть что получится: lsfusion.org/try Вкладка платформа, просто вставить, нажать play.Ta_Da
24.08.2019 17:21Получилась форма с табличкой. В которой колонки нетипизированы и никак не привязаны к данным. Это не особенно тянет на «форму с товарами, которую можно редактировать как в excel», простите.
Veidt
24.08.2019 17:34Они типизированы и привязаны к данным.
То есть дальше делаем:
CLASS Document;
CLASS DocumentDetail;
document = DATA Document (DocumentDetail);
sku = DATA Sku (DocumentDetail);
nameSku(DocumentDetail dt) = name(sku(dt));
FORM
OBJECTS d=Document, dt=DocumentDetail
FILTERS document(dt) = d
PROPERTIES (dt) nameSku
;
И вводим документ, при нажатии на имя товара будет список из товаров, введенных в этой «excel» форме.
Или вы что-то другое имеете ввиду?Ta_Da
24.08.2019 17:56Возможно неудачно выразился. Смущает, что количество — это строка.
Контроля остатков и показа их — нет. Цен тут тоже нет и т.д. и т.п., тем не менее уже добавились дополнительные 10 строк кода, а форма выглядит как «привет из 1С 7.x» 94 года выпуска (хотя да, там бы пришлось больше строк кода написать — тут победа).Veidt
24.08.2019 18:03Издеваетесь? Я специально взял максимально простой случай, чтобы была понятна разница. Замените количество, не знаю на номер.
Вообще более сложная задача тут:
documentation.lsfusion.org/pages/viewpage.action?pageId=2228636
Production-ready тут:
github.com/lsfusion-solutions/erp
Но если начать усложнять пример, поверьте, это будет не в пользу 1С. Ну и 95% форм в том же УТ состоящих из простейших списков это все тот же 1С 7.7 94 года выпуска. Или вы реально думаете что раскрасив их поярче что-то изменилось.
Veidt
24.08.2019 18:31В любом случае меня интересует форма на 1С именно в постановке как я написал. Просто сейчас готовится статья «Почему не 1С» и там будет в том числе пункт про редактирование списков, возможно мы что-то упускаем, и есть какой-то простой способ реализовать эту форму.
Ну и если конечно не трудно, хотя бы приблизительный код этой формы на 1С, чтобы мы могли в статью добавить. Мы были бы очень благодарны.Ta_Da
24.08.2019 19:20Ну и если конечно не трудно, хотя бы приблизительный код этой формы на 1С, чтобы мы могли в статью добавить. Мы были бы очень благодарны.
Ну вы ведь готовите статью «почему не 1С», вот и готовьте. Изучите например платформу, а то у вас те же проблемы что и 10 лет назад (только тогда вы продавали пользователям LSTrade и убеждали на своем сайте, что создание собственной платформы и собственного языка — это глупость и 1С пошла по неверному пути) — вы не знаете возможностей платформы 1С, но уверенно рассказываете о своих преимуществах.Veidt
24.08.2019 19:40Я уже неделю изучаю. Сверху приводили 5 разных форумов, где все говорят что нельзя так делать.
Но вы один утверждаете, что можно. И я все хочу выяснить как, может это какое-то секретное знание.
Хотя это какая-то странная фишка 1Сцев. Нет, чтобы просто сказать, да не умеет. Но нет, они будут защищать платформу до последней капли крови.
В любом случае не хотите, можете не отвечать, я вполне уверен, что был бы простой способ вы бы его привели. Это все что мне нужно было узнать. Лично вас я не переубежу, я это уже понял.
CrushBy
24.08.2019 20:28CSS никто не отменял. Можно себе разрисовать как угодно. Просто никому не надо. Выше уже писали про это.
Дело в том, что в B2B гораздо важнее не дизайн, а скорость работы. Так вот в веб-версии и 1С, и Dynamics, лично мне хочется чем-нибудь кинуть в монитор после пары минут работы, так как там на базовых простых действиях (типа открытия формы) висит по пару секунд и постоянно что-то «залипает». А если форма сложная, то вообще просто ужас. У нас есть клиенты, которые работают и с 1С и с lsFusion, так вот им тоже сначала не понравился дизайн. Но потом, когда привыкли, признали, что гораздо важнее то, что в lsFusion все летает.
oldschoolgeek
Ну почему, почему, когда в СНГ берутся делать конструктор бизнес-приложений, то из пользовательского интерфейса вовсю «торчат уши» 1С? :(
Искренне и положа руку на сердце — запускал ваши онлайн-демо с ожиданием увидеть действительно современный UI ну хотя бы на уровне Dynamics 365. Но, увы — в реальности увидел всё ту же 1С парадигму, только реализованную на других технологиях :(
Пожалуйста, не надо так! У вас может получиться действительно классный и востребованный продукт, но для этого я бы очень советовал перенять современные подходы к проектированию CRUD интерфейсов.
sergeevaira Автор
А можете уточнить, что Вы подразумеваете под 1С парадигмой?
И в 1С, и в lsFusion и в Dynamics схема вроде одинаковая:
Разница лишь в дизайне, но не столь принципиальная, на мой взгляд.
Какие именно «современные подходы к проектированию CRUD интерфейсов» Вы имеете ввиду?
oldschoolgeek
Смотря кого вы рассматриваете в качестве вашей целевой аудитории. Я работаю в компании, которая сама занимается разработкой ПО, и точно могу сказать, что ИТ специалистами вот такой дизайн интерфейса, как в 1С / InFusion, однозначно воспринимается как нечто архаичное, неудобное и отталкивающее.
В результате, мы сделали собственный конструктор на базе современных библиотек Web UI компонентов — пусть не такой универсальный, но гораздо более приятный и удобный визуально.
В первую очередь, task-based UI:
sergeevaira Автор
В качестве целевой аудитории мы рассматриваем бизнес. Интерфейсы делаем исключительно для сотрудников бизнеса. Бизнесу важно, чтобы сотрудники быстро и эффективно выполняли свою работу. Доплачивать за дизайн обычно никто не хочет. Поэтому основная задача состоит в том, чтобы быстро и дешево делать сотни объектов, таблиц и форм в соответствии с процессами заказчика, при помощи которых сотрудники будут их выполнять. На ваших скринах я вижу те же панели, таблички, просто красивее отрисованные. Однако, как я выше привел пример с Dynamics 365 Retail, это вовсе не значит, что с ними будет удобно работать.
Тут ключевая проблема именно в универсальности. Бизнес выберет решение, которое закрывает процессы на 100% без дизайна вообще, чем решением, которое покрывает 30% процессов, но очень красиво.
А какое отношение task-based UI имеет к CRUD? Можете дать ссылки на разъяснения того, что вы подразумеваете под этими терминами? А то видимо у нас разное представление о значении этих терминов. Если речь идет про BPM, то оно вообще обычно параллельно классическим CRUD интерфейсам.
NitroJunkie
Строго говоря в lsFusion можно custom design на React делать:
https://codesandbox.io/s/1y0o894rx4.
Тут и тут немного подробнее.