image

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

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

Задача


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

Рассмотрим три часто встречаемых в бизнес-приложениях типа документов:

  1. Заказ на закупку. В таких документах пользователю логично показывать список всех товаров, доступных для заказа от поставщика. В колонки удобно показывать текущий остаток, реализацию за определенный интервал, кол-во заказанного на закупку и продажу.
  2. Заказ на продажу. Здесь чаще всего показывается список товаров, которые есть на остатках выбранного склада и доступны для продажи выбранному клиенту. Также должны показываться текущие цены
  3. Изменение остатков. Это документ используется для корректировки текущих остатков в случае выявления каких-то расхождений с фактическим количеством. В подборе обычно показываются все товары, с возможностью вводить фактический остаток для любого из них. При этом в документ добавляется товар с количеством равным разнице между фактическим и текущим остатком.

Решение


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

Для начала добавим справочник товаров через стандартный CRUD интерфейс:
CLASS Product 'Товар';
name 'Наименование' = DATA STRING[50] (Product);

FORM product 'Товар'
    OBJECTS p = Product PANEL
    PROPERTIES(p) name
    
    EDIT Product OBJECT p // эта форма будет использоваться для редактирования товара
;

FORM products 'Товары'
    OBJECTS p = Product
    PROPERTIES(p) READONLY name
    PROPERTIES(p) NEWSESSION NEWEDITDELETE
    
    LIST Product OBJECT p // эта форма будет использоваться, когда нужно будет выбрать товар из списка
;

NAVIGATOR {
    NEW products;
}

Создадим понятие поставщик, и в форме редактирования дадим возможность выбирать товары, с которыми он работает:
CLASS Supplier 'Поставщик';
name 'Наименование' = DATA STRING[50] (Supplier);

in 'Вкл' = DATA BOOLEAN (Supplier, Product); // будет TRUE, если у поставщика разрешено закупать этот товар 

FORM supplier 'Поставщик'
    OBJECTS s = Supplier PANEL
    PROPERTIES(s) name
    
    OBJECTS p = Product // на форму поставщика добавляем список всех товаров
    PROPERTIES in(s, p), name(p) READONLY // даем возможность проставлять галочку для нужных
    
    EDIT Supplier OBJECT s
;

FORM suppliers 'Поставщики'
    OBJECTS s = Supplier 
    PROPERTIES(s) READONLY name
    PROPERTIES(s) NEWSESSION NEWEDITDELETE
    
    LIST Supplier OBJECT s
;

NAVIGATOR {
    NEW suppliers;
}

Объявим логику заказов со строками:
CLASS Order 'Заказ';
date 'Дата' = DATA DATE (Order);
number 'Номер' = DATA INTEGER (Order);

supplier 'Поставщик' = DATA Supplier (Order);
nameSupplier 'Поставщик' (Order o) = name(supplier(o));
  
CLASS OrderDetail 'Строка заказа';
order 'Заказ' = DATA Order (OrderDetail) NONULL DELETE;

Добавляем к строкам товары и количество:
product 'Товар' = DATA Product (OrderDetail);
nameProduct 'Товар' (OrderDetail d) = name(product(d));

quantity 'Кол-во' = DATA NUMERIC[14,3] (OrderDetail);

Переходим непосредственно к построению нужной нам формы редактирования заказа. Для начала добавляем на нее сам заказ и его строки:
FORM order 'Заказ'
    OBJECTS o = Order PANEL
    PROPERTIES(o) date, number, nameSupplier
    
    OBJECTS d = OrderDetail
    PROPERTIES(d) nameProduct, quantity, NEWDELETE
    FILTERS order(d) = o
    
    EDIT Order OBJECT o
;

Тем самым мы получаем стандартный интерфейс по работе со строками заказа через добавление и удаление.
Дальше добавляем на эту форму нужный нам функционал подбора. Для этого сначала создаем на форме объект со списком всех товаров, в котором фильтруем только те, которые разрешены к заказу у выбранного поставщика:
EXTEND FORM order
    OBJECTS p = Product
    PROPERTIES name(p) READONLY
    FILTERS in(supplier(o), p) // фильтруем только доступные для заказа товары
;

Настраиваем дизайн, чтобы строки заказа и подбор отображались как вкладки одного контейнера:
DESIGN order {
    OBJECTS {
        NEW pane { // создаем контейнер после заголовка заказа
            fill = 1// растягиваем во весь размер 
            type = TABBED// контейнер, элементы
            MOVE BOX(d); // перемещаем туда таблицу со строками заказов
            MOVE BOX(p) { // перемещаем вновь добавленную таблицу с товарами
                caption = 'Подбор';
            }
        }
    }
}

Строим вспомогательные свойства для отображения и ввода пользователем количества в соответствующей колонке:
quantity 'Кол-во' (Order o, Product p) = 
    GROUP SUM quantity(OrderDetail d) BY order(d), product(d);
lastOrderDetail 'Последняя строка' (Order o, Product p) = 
    GROUP LAST OrderDetail d ORDER d BY order(d), product(d);

Первое свойство считает для заказа и товара его количество в этом документе. Второй находит последнюю строку (пользователь может ввести несколько строк с одним товаром).
Дальше создаем действие, которое будет обрабатывать ввод пользователем значения в соответствующую колонку во вкладке подбора:
changeQuantity 'Изменить кол-во' (Order o, Product p)  { 
    INPUT q = NUMERIC[14,3DO { // запрашиваем число
        IF lastOrderDetail(o, p) THEN { // проверяем, есть ли хоть одна строка
            IF q THEN // ввели число
                quantity(OrderDetail d) <- q IF d = lastOrderDetail(o, p) 
                    WHERE order(d) = o AND product(d) = p; // записываем количество в последнюю строку с такой книгой
            ELSE // сбросили число - удаляем строку
                DELETE OrderDetail d WHERE order(d) = o AND product(d) == p;   
        } ELSE
            IF q THEN
                NEW d = OrderDetail { // создаем новую строку
                    order(d) <- o;
                    product(d) <- p;
                    quantity(d) <- q;
                }
    }
}

И наконец добавляем колонку на форму, указывая действие, которое должно выполняться, когда пользователь будет пытаться менять ее значение:
EXTEND FORM order
    PROPERTIES(o, p) quantity ON CHANGE changeQuantity(o, p)
;

Осталось только нарисовать форму со списком заказов и добавить ее в навигатор:
FORM orders 'Заказы'
    OBJECTS o = Order
    PROPERTIES(o) READONLY date, number
    PROPERTIES(o) NEWSESSION NEWEDITDELETE
;

NAVIGATOR {
    NEW orders;
}

Результирующая форма будет выглядеть приблизительно вот так:

image
Любые изменения сделанные на любой из вкладок будут автоматически отражаться на другой.

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

image

Посмотрим как этот функционал реализован в других бизнес-приложениях.


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

image

В этом диалоге подбирать товар можно следующим образом:

image

В этом механизме есть, как минимум, два неудобства.

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

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

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

Microsoft Dynamics 365


В качестве решения я взяла Retail (только в нем я нашла похожий функционал из доступных на https://trials.dynamics.com). В нем вызвать подбор можно на форме Purchase orders двумя способами:

image

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

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

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

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

image

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

Заключение


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

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

Такую схему можно реализовать, например, в том же React, используя в качестве состояния текущие строки документа и отображая его двумя компонентами в двух разных вкладках. Но следует помнить, что записей в таблице с товарами может быть очень много, и придется реализовывать так называемый “infinite scroll”. Кроме того, желательно добавить пользователю возможность сортировать и фильтровать товары в этом списке (причем это надо делать на сервере, а не на клиенте, чтобы не тянуть туда лишние данные). Все это становится достаточно нетривиальной задачей для разработчика.

В платформе lsFusion этот функционал реализуется из коробки и требует лишь описанный выше код. Попробовать как это работает, а при желании и модифицировать код, можно онлайн на соответствующей странице. Вот исходный код целиком, который можно вставить на вкладку Платформа и затем нажав Play:

Исходный код
CLASS Product 'Товар';
name 'Наименование' = DATA STRING[50] (Product);

FORM product 'Товар'
    OBJECTS p = Product PANEL
    PROPERTIES(p) name
    
    EDIT Product OBJECT p // эта форма будет использоваться для редактирования товара
;

FORM products 'Товары'
    OBJECTS p = Product
    PROPERTIES(p) READONLY name
    PROPERTIES(p) NEWSESSION NEWEDITDELETE
    
    LIST Product OBJECT p // эта форма будет использоваться, когда нужно будет выбрать товар из списка
;

NAVIGATOR {
    NEW products;
}

CLASS Supplier 'Поставщик';
name 'Наименование' = DATA STRING[50] (Supplier);

in 'Вкл' = DATA BOOLEAN (Supplier, Product); // будет TRUE, если у поставщика разрешено закупать этот товар 

FORM supplier 'Поставщик'
    OBJECTS s = Supplier PANEL
    PROPERTIES(s) name
    
    OBJECTS p = Product // на форму поставщика добавляем список всех товаров
    PROPERTIES in(s, p), name(p) READONLY // даем возможность проставлять галочку для нужных
    
    EDIT Supplier OBJECT s
;

FORM suppliers 'Поставщики'
    OBJECTS s = Supplier 
    PROPERTIES(s) READONLY name
    PROPERTIES(s) NEWSESSION NEWEDITDELETE
    
    LIST Supplier OBJECT s
;

NAVIGATOR {
    NEW suppliers;
}

CLASS Order 'Заказ';
date 'Дата' = DATA DATE (Order);
number 'Номер' = DATA INTEGER (Order);

supplier 'Поставщик' = DATA Supplier (Order);
nameSupplier 'Поставщик' (Order o) = name(supplier(o));
  
CLASS OrderDetail 'Строка заказа';
order 'Заказ' = DATA Order (OrderDetail) NONULL DELETE;

product 'Товар' = DATA Product (OrderDetail);
nameProduct 'Товар' (OrderDetail d) = name(product(d));

quantity 'Кол-во' = DATA NUMERIC[14,3] (OrderDetail);

FORM order 'Заказ'
    OBJECTS o = Order PANEL
    PROPERTIES(o) date, number, nameSupplier
    
    OBJECTS d = OrderDetail
    PROPERTIES(d) nameProduct, quantity, NEWDELETE
    FILTERS order(d) = o
    
    EDIT Order OBJECT o
;

EXTEND FORM order
    OBJECTS p = Product
    PROPERTIES name(p) READONLY
    FILTERS in(supplier(o), p) // фильтруем только доступные для заказа товары
;

DESIGN order {
    OBJECTS {
        NEW pane { // создаем контейнер после заголовка заказа
            fill = 1// растягиваем во весь размер 
            type = TABBED// контейнер, элементы
            MOVE BOX(d); // перемещаем туда таблицу со строками заказов
            MOVE BOX(p) { // перемещаем вновь добавленную таблицу с товарами
                caption = 'Подбор';
            }
        }
    }
}

quantity 'Кол-во' (Order o, Product p) = 
    GROUP SUM quantity(OrderDetail d) BY order(d), product(d);
lastOrderDetail 'Последняя строка' (Order o, Product p) = 
    GROUP LAST OrderDetail d ORDER d BY order(d), product(d);

changeQuantity 'Изменить кол-во' (Order o, Product p)  { 
    INPUT q = NUMERIC[14,3DO { // запрашиваем число
        IF lastOrderDetail(o, p) THEN { // проверяем, есть ли хоть одна строка
            IF q THEN // ввели число
                quantity(OrderDetail d) <- q IF d = lastOrderDetail(o, p) 
                    WHERE order(d) = o AND product(d) = p; // записываем количество в последнюю строку с такой книгой
            ELSE // сбросили число - удаляем строку
                DELETE OrderDetail d WHERE order(d) = o AND product(d) == p;   
        } ELSE
            IF q THEN
                NEW d = OrderDetail { // создаем новую строку
                    order(d) <- o;
                    product(d) <- p;
                    quantity(d) <- q;
                }
    }
}

EXTEND FORM order
    PROPERTIES(o, p) quantity ON CHANGE changeQuantity(o, p)
;

FORM orders 'Заказы'
    OBJECTS o = Order
    PROPERTIES(o) READONLY date, number
    PROPERTIES(o) NEWSESSION NEWEDITDELETE
;

NAVIGATOR {
    NEW orders;
}

Комментарии (71)


  1. oldschoolgeek
    21.08.2019 16:35

    Ну почему, почему, когда в СНГ берутся делать конструктор бизнес-приложений, то из пользовательского интерфейса вовсю «торчат уши» 1С? :(

    Искренне и положа руку на сердце — запускал ваши онлайн-демо с ожиданием увидеть действительно современный UI ну хотя бы на уровне Dynamics 365. Но, увы — в реальности увидел всё ту же 1С парадигму, только реализованную на других технологиях :(

    Пожалуйста, не надо так! У вас может получиться действительно классный и востребованный продукт, но для этого я бы очень советовал перенять современные подходы к проектированию CRUD интерфейсов.


    1. sergeevaira Автор
      21.08.2019 18:21

      А можете уточнить, что Вы подразумеваете под 1С парадигмой?

      И в 1С, и в lsFusion и в Dynamics схема вроде одинаковая:

      1. Обычное иерархическое меню, где выбирается, например, Purchase orders
      2. Дальше идет список заказов с кнопками Добавить/Редактировать/Удалить
      3. Форма редактирования заказов, где можно задавать атрибуты шапки и табличная часть со список строк

      Разница лишь в дизайне, но не столь принципиальная, на мой взгляд.

      Какие именно «современные подходы к проектированию CRUD интерфейсов» Вы имеете ввиду?


      1. oldschoolgeek
        22.08.2019 19:50

        Разница лишь в дизайне, но не столь принципиальная, на мой взгляд.


        Смотря кого вы рассматриваете в качестве вашей целевой аудитории. Я работаю в компании, которая сама занимается разработкой ПО, и точно могу сказать, что ИТ специалистами вот такой дизайн интерфейса, как в 1С / InFusion, однозначно воспринимается как нечто архаичное, неудобное и отталкивающее.

        В результате, мы сделали собственный конструктор на базе современных библиотек Web UI компонентов — пусть не такой универсальный, но гораздо более приятный и удобный визуально.

        Какие именно «современные подходы к проектированию CRUD интерфейсов» Вы имеете ввиду?


        В первую очередь, task-based UI:

        image

        image


        1. sergeevaira Автор
          22.08.2019 21:22

          Смотря кого вы рассматриваете в качестве вашей целевой аудитории


          В качестве целевой аудитории мы рассматриваем бизнес. Интерфейсы делаем исключительно для сотрудников бизнеса. Бизнесу важно, чтобы сотрудники быстро и эффективно выполняли свою работу. Доплачивать за дизайн обычно никто не хочет. Поэтому основная задача состоит в том, чтобы быстро и дешево делать сотни объектов, таблиц и форм в соответствии с процессами заказчика, при помощи которых сотрудники будут их выполнять. На ваших скринах я вижу те же панели, таблички, просто красивее отрисованные. Однако, как я выше привел пример с Dynamics 365 Retail, это вовсе не значит, что с ними будет удобно работать.

          пусть не такой универсальный, но гораздо более приятный и удобный визуально

          Тут ключевая проблема именно в универсальности. Бизнес выберет решение, которое закрывает процессы на 100% без дизайна вообще, чем решением, которое покрывает 30% процессов, но очень красиво.

          В первую очередь, task-based UI:

          А какое отношение task-based UI имеет к CRUD? Можете дать ссылки на разъяснения того, что вы подразумеваете под этими терминами? А то видимо у нас разное представление о значении этих терминов. Если речь идет про BPM, то оно вообще обычно параллельно классическим CRUD интерфейсам.


        1. NitroJunkie
          23.08.2019 08:40

          Строго говоря в lsFusion можно custom design на React делать:

          https://codesandbox.io/s/1y0o894rx4.

          Тут и тут немного подробнее.


  1. vadikvs
    21.08.2019 18:21

    Попробуйте сделать подбор товара как в 1с 7.7 торговля и склад. Это самый быстрый удобный побор который я видел и пользовался. Многие мои знаковые в оптовой торговле не хотят до сих пор менять 1с 7.7 на 8. именно из-за удобства быстрого подбора товара в накладную.


    1. sergeevaira Автор
      21.08.2019 18:25

      К сожалению, не могу найти нигде в свободном доступе механизм подбора в 7.7. Чем он принципиально отличается от того, что описан в статье? Можете сделать GIF по аналогии с теми, что в статье, или скинуть ссылку на YouTube? Там тоже можно вводить количество в колонки?


    1. heiheshang
      22.08.2019 21:13

      Не понятно что вашим знакомым мешает в 8-ке сделать подбор как 7.7?


      1. NitroJunkie
        23.08.2019 08:38

        Начнем, я полагаю, с того факта, что в 8-ке нельзя редактировать значения прямо в списке (кроме табличных частей). Речь про УФ естественно, потому как если использовать ОФ, непонятно зачем вообще с 7.7 переходить.

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


        1. heiheshang
          23.08.2019 09:37

          Не совсем понятно о чем вы говорите, о списке или о таблице, но редактировать можно что там что там. Вы ничего не говорите о конфигурации, если речь о 10.3 то она не сильно от 9.2 отличается, если про УТ 11.4 то она конечно сильно отличается от 9.2, но подбор типовой работает везде сходным образом. Разница объясняется наличием возможности в 10.3 и 11.4 выписывать товар с нескольких складов в одной накладной, в 9.2 такой возможности нет.


          1. 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: Ну и еще раз уточняю речь про УФ.


            1. heiheshang
              23.08.2019 10:20

              Начнем с того что в 7.7 не было динамических списков, вы тогда как в 9.2 делайте, выводите форму справочника, а остатки выводите в колонку «аля вычисляемое поле». Не уверен что в Axapta или lsFusion можно просто так отредактировать значение строки полученной в результате сложного запроса, у вас поле которое вы редактируете может быть результатом вычисления по полям из нескольких таблиц и не совсем понятно куда вы будите записывать значение?
              Вы не полностью раскрываете задачу, но требуете решения. В 9.2 конфиге нет возможности ввести количество в подборе в ячейке, там выскакивает модальное окно с запросом количества или количества и цены в зависимости от настроек. Вы пишите о кастомном решение для конкретного клиента.


              1. Veidt
                23.08.2019 10:28

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

                Если это первичные данные (читай поле таблицы), то можно редактировать, и записываться будет в эти же данные (опять таки в поле таблицы), все из коробки. Более того можно для вычисляемого поля задать редактирование первичных данных (см. пример в статье) и форма сама автоматически обновится по окончании редактирования поля (сразу, а не после записи в базу !). Собственно посмотрите гифку подбора в lsFusion. Как такое же на 1С сделать?
                В 9.2 конфиге нет возможности ввести количество в подборе в ячейке, там выскакивает модальное окно с запросом количества или количества и цены в зависимости от настроек. Вы пишите о кастомном решение для конкретного клиента.

                Не совсем понял о каком кастомном решении речь идет. Обычный WYSIWYG, как в Excel, то есть видишь товары — заполняешь в колонку количество. Супер примитивный кейс.

                Собственно об этом видимо и писал человек, когда говорил про 7.7.


                1. heiheshang
                  23.08.2019 10:30

                  Еще раз в Типовой 9.2 нет возможности как в Excel забить количество в ячейку.


                  1. Veidt
                    23.08.2019 10:33

                    Причем тут типовая? Речь о платформе. В УФ в принципе Excel-style интерфейсы строить нельзя. Только такое извращение как в статье, отдельно список товаров, отдельно строки с количеством, и добавление строк по двойному клику.

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


                    1. heiheshang
                      23.08.2019 10:40

                      Если вы возьмете любой регламинтированый отчет в бухгалтерии, то там как раз
                      Excel-style интерфейс


                      1. Veidt
                        23.08.2019 11:03

                        Ну речь шла все же про формы ввода (в частности подбор). Или что вы имеете ввиду под регламентированным отчетом, можете скрин скинуть?


                        1. heiheshang
                          23.08.2019 11:27

                          Да речь о подборе, но как в 7.7. В 7.7 не как в Axapta или lsFusion. В 7.7 нет динамических списков, если хотите как в 7.7 то и делайте в 8-ке как в 7-ке делали, не через динамические списки.
                          Excel-style интерфейс это табличные документы, сделайте табличный документ, заполните его товарами и редактируйте на здоровье как в Excel


                          1. Veidt
                            23.08.2019 11:30

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


                            1. heiheshang
                              23.08.2019 11:34

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


                              1. Veidt
                                23.08.2019 11:44

                                Что-то я совсем запутался.

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

                                Если нет — то считывая 100к товаров в таблицу значений при каждом открытии / отборе у вас любой сервер ляжет.


                                1. heiheshang
                                  23.08.2019 11:46

                                  Сервер не ляжет. Я говорю что идея считывать 100к не очень разумная идея.


                                  1. Veidt
                                    23.08.2019 11:55

                                    То есть если 100 пользователей будут каждую минуту открывать и работать с формой подбора, а ширина записи товара скажем 1кб, то одно только это будет 10гб жрать, и это только одна таблица значений. Плюс затраты на ее заполнение.

                                    В любом случае если вы говорите, что это не очень разумная идея. Как в 1С нормально (в смысле масштабируемо) реализовать ввод «как в Excel»?


                                    1. heiheshang
                                      23.08.2019 12:08

                                      Почему вы так зациклены на вводе как в Excel?
                                      Я уже написал вам как, можете через табличный документ реализовать.
                                      За мою 20 летнюю практику ни кто не настаивал именно на таком.


                                      1. Veidt
                                        23.08.2019 12:15

                                        Почему вы так зациклены на вводе как в Excel?

                                        Так как это WYSIWYG, то есть самый удобный и эргономичный способ. Ну реально не таким же извращением как в УТ 11 это делать.
                                        Я уже написал вам как, можете через табличный документ реализовать.

                                        Табличный документ это отчет. Вы предлагаете подбор через отчет делать? Серьезно? Плюс как там с отборами, сортировками и вообще куда там кнопку перенести в документ повесить?
                                        За мою 20 летнюю практику ни кто не настаивал именно на таком.

                                        Ну так может пользователи у вас ничего кроме 1С никогда не видели. А им там четко сказали не позволяют технические возможности и вообще дешево / у всех бухгалтерия на 1С и т.п.


                                        1. heiheshang
                                          23.08.2019 12:27

                                          не совсем понимаю при чем тут WYSIWYG
                                          «Табличный документ это отчет.» табличный документ — это не отчет — это табличный документ, если вам так важен вид как в excel, то по кнопке подбор открывайте табличный документ, а не форму справочника


                                          1. Veidt
                                            23.08.2019 12:34

                                            WYSIWYG — это означает, что я редактирую то что вижу, а вижу то что отредактировал. Без всплывающих окон, дополнительных списков и всякой такой ерунды.

                                            Я правильно понимаю вы этот табличный документ имеете в виду:
                                            image
                                            Как в нем подбор можно сделать?


                                            1. heiheshang
                                              23.08.2019 16:45

                                              Я имею в виду вот это http://v8.1c.ru/overview/Term_000000288.htm
                                              Хотя табличные документы используются, в основном, для представления уже обработанной информации, существует возможность непосредственного ввода данных в табличный документ как в «обычную» электронную таблицу.


                                              1. Veidt
                                                23.08.2019 17:04

                                                Как я понял это все равно что в Paint редактировать, никакого отношения к данным не имеет.

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


                                                1. heiheshang
                                                  23.08.2019 17:08

                                                  Нет вы не поняли.


                                                  1. Veidt
                                                    23.08.2019 17:16

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


                                                    1. heiheshang
                                                      23.08.2019 17:21

                                                      Что вы имеете в виду под списком?


                                                      1. Veidt
                                                        23.08.2019 17:31

                                                        image
                                                        Вторая вкладка (Подбор). Там список товаров из ассортимента поставщика и туда же вводится значение.


                                                        1. heiheshang
                                                          23.08.2019 17:43

                                                          Честно говоря я не понимаю в чем у вас проблема и почему вы не можете реализовать такой вариант. Табличный документ вам для этого точно подойдет. Откройте БП 3.0 возьмите Отчет по НДС, там подобное есть, не один в один, но понять можно.


                                                          1. Veidt
                                                            23.08.2019 17:58

                                                            Причем тут отчет? Мне отчёт на 100к товаров открывать каждый раз? Нужно как минимум чтобы только видимые данные читались, как в динамическом списке.


                                                            Ну и есть пример с кодом? А то все примеры что я видел там все руками надо делать.


                                                            1. heiheshang
                                                              23.08.2019 18:00

                                                              Не понимаю в чем проблема повесить событие на выбор значения из поля поставщик и после этого заполнить табличный документ списком товаров поставщика? У поставщика же не будет 100К товаров


                                                              1. Veidt
                                                                23.08.2019 18:18

                                                                То есть вы все таки понимаете о чем речь :)


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


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


                                                                1. heiheshang
                                                                  24.08.2019 04:22

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


                                                              1. CrushBy
                                                                23.08.2019 19:13

                                                                При заказе на продажу или списании товара нужно видеть товары всех поставщиков, которые есть в наличии (а при работе под заказ вообще всех).


                                                                1. heiheshang
                                                                  24.08.2019 04:01

                                                                  Это у вас наверное сидит человек и глазками просматривает номенклатуру и делает заказ, а у меня в 1С делается формирование заказа обработкой и человек корректирует и там ну ни как 100к не получается. При списании зачем вам вся номенклатура, достаточно той что списываете, можно просто в табличной части набрать первые буквы списываемого товара и список покажется уже отфильтрованый


                                                                  1. CrushBy
                                                                    24.08.2019 07:57

                                                                    Ясно. Понятно. Классическая аргументация 1С программиста. «У меня вот так платформа умеет, а остальное вам не надо. И так сойдет.».

                                                                    Причем здесь обработка? Как вернутся в интерфейс обработки, если пользователь ошибся и заказ уже сформирован и нужно видеть опять все данные?


                                                                    1. heiheshang
                                                                      24.08.2019 12:55

                                                                      Мне кажется вы не читаете документацию раз задаете такие вопросы. Вы деньги заплатите тому кто знает как это сделать.

                                                                      Глобальный контекст (Global context)
                                                                      ОткрытьФорму (OpenForm)
                                                                      Вариант синтаксиса: По имени
                                                                      Синтаксис:
                                                                      ОткрытьФорму(<ИмяФормы>, <Параметры>, <Владелец>, <Уникальность>, <Окно>, <НавигационнаяСсылка>, <ОписаниеОповещенияОЗакрытии>, <РежимОткрытияОкна>)

                                                                      В <Параметры> передайте ссылку на документ, в обработчике открытия формы обработайте свою ситуацию.


                                                                      1. CrushBy
                                                                        24.08.2019 14:44

                                                                        А вкладками как сделать? Чтобы как в статье.


                                                                        1. heiheshang
                                                                          24.08.2019 14:49

                                                                          В дизайнере форм Группу на форму кинуть


                                                                  1. Veidt
                                                                    24.08.2019 16:04

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


                                                                    1. heiheshang
                                                                      24.08.2019 16:06

                                                                      Вы в УТ 11.4 видели блок планирования?


                                                                      1. Veidt
                                                                        24.08.2019 16:17

                                                                        Блок планирования продаж? Угадывающий, что закажет клиент?


                                                                        1. heiheshang
                                                                          24.08.2019 16:46

                                                                          Планирования закупок.
                                                                          А вы каким-то образом угадываете что закажет клиент?


                                                                          1. Veidt
                                                                            24.08.2019 17:01

                                                                            Нет, поэтому и нужны подборы с вводом в списке товаров.


                                                                            1. heiheshang
                                                                              24.08.2019 17:49

                                                                              А исходя из чего у вас человек принимает решение о заказе того или иного товара и в каком количестве?


                                                                              1. Veidt
                                                                                25.08.2019 08:34

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


                                                                                1. heiheshang
                                                                                  25.08.2019 08:43

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


                                    1. heiheshang
                                      23.08.2019 12:14

                                      в Axapta или lsFusion как то по другому данные на клиента попадаю?


                                      1. Veidt
                                        23.08.2019 12:31

                                        Не совсем понял вопрос. В lsFusion данные тоже считываются видимыми порциями в результате SQL-запросов, но lsFusion умеет в этих запросах учитывать сделанные в сессии изменения и показывать данные с учетом изменений. А 1С нет.


                                        1. heiheshang
                                          23.08.2019 16:39

                                          Вы делаете не корректное утверждение что 1С так не умеет, 1С так умеет.


                                          1. Veidt
                                            23.08.2019 16:43

                                            Ну так расскажите как, а то я уже второй день бодаюсь, не могу понять как реализовать такой подбор как в lsFusion в статье.


                                            1. Ta_Da
                                              24.08.2019 13:52

                                              Вариант 1:
                                              1) Добавляете на форму таблицу значений.
                                              2) Пишете запрос для ее заполнения (или берете тот же, что используется в динамическом списке).
                                              2*) Используете СКД для заполнения таблицы значений, чтобы не рисовать самому отборы и фильтры, а предоставить пользователю возможность настройки «как в динамическом списке».
                                              3) Чтобы не грузить весь справочник целиком, по аналогии с динамическим списком, добавляете в запрос чтение данных порциями (реализуется с использованием конструкции «TOP N» ).

                                              Вариант 2 (не подойдет для мобильного приложения):
                                              1) Используете динамический список.
                                              2) Передаете в него таблицу уже отобранных товаров.
                                              3) Добавляете обработчик на выбор значения поля «Количество», который будет открывать окошко ввода количества (минус — отдельное окошко, плюс — на него можно навесить дополнительные функции типа добавления товара кратно упаковкам и т.д.)

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


                                              1. Veidt
                                                24.08.2019 15:59

                                                Спасибо за ответ. Собственно я так и думал, но тут мягко говоря есть ряд вопросов:

                                                Вариант 1:
                                                1) А что делать со скроллингом? То есть пользователь нажал pagedown, надо дочитать еще данные, что дальше делать? Еще один запрос? Но тогда туда придется достаточно сложные условия добавлять вроде Порядок1 = ТекущееЗначениеПорядка1 И Порядок2 > ТекущееЗначениеПорядка2 ИЛИ Порядок1 > ТекущееЗначениеПорядка1.
                                                2) Непонятно что делать с измененными значениями. То есть пользователь что-то изменил в этой таблице, проскроллил вниз, проскроллил вверх он должен увидеть, то что он изменил. То есть нужно сливать ранее измененные значения со считанными. Как это поддержать?
                                                3) Вы понимаете сколько там кода будет при этом? То что в lsFusion из коробки одной строчкой делается.

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


                                                1. Ta_Da
                                                  24.08.2019 17:14

                                                  1)

                                                  Но тогда туда придется достаточно сложные условия добавлять

                                                  Условие «первые <ЧислоЭлементовНаЭкране> ИЗ (Первые <ЧислоЭлементовНаЭкране + Смещение>)».

                                                  2)
                                                  Вы понимаете сколько там кода будет при этом? То что в lsFusion из коробки одной строчкой делается

                                                  Вы хотели редактирование «как в Excel» и утверждали, что на 1С это реализовать не возможно. Я предложил несколько различных вариантов реализации. Количество строк кода сравнивать смысла не вижу. Иначе я могу, например, напомнить, что какой-нить динамический список справочника в 1С можно создать без единой строчки кода и нажатий на кнопки мыши — система автоматически сгенерирует ее при обращении к справочнику.
                                                  Во-вторых, отборы/сортировки/условные оформления/поиск по подстроке доступные в динамических списках без единой строчки кода, в том числе на уровне пользователя, на lsfusion также можно реализовать с помощью 1-2 строк?

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

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

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

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

                                                  5)
                                                  А как его сделать динамическим, чтобы только порциями записи читались?

                                                  Точно также как и с таблицей значений.

                                                  6)
                                                  Ну и вы же представляете какое это извращение ввод в отчете реализовывать

                                                  Понимаете, для меня тот вариант подбора, который реализован у вас, кажется извращением. Это вопрос вкусов и привычек.
                                                  Но если подходить формально — ввод данных в табличном документе, наиболее близко подходит к определению «как в Excel».


                                                  1. 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)


                                                    1. 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С».
                                                      При этом, у меня также есть пользователи, которые верхом садизма будут считать делать так, как предлагаете вы.
                                                      Увы, мир несовершенен.

                                                      Или вы реально считаете что подбор с двумя списками это нормально?

                                                      Откройте любой интернет магазин с корзиной товаров. Как ни странно — но это именно два списка с редактированием количества в отдельном окне.


                                                      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 позиций будете заказывать, это очень неудобно будет.


                                              1. 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.


                                                1. Ta_Da
                                                  24.08.2019 17:21

                                                  Получилась форма с табличкой. В которой колонки нетипизированы и никак не привязаны к данным. Это не особенно тянет на «форму с товарами, которую можно редактировать как в excel», простите.


                                                  1. 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» форме.

                                                    Или вы что-то другое имеете ввиду?


                                                    1. Ta_Da
                                                      24.08.2019 17:56

                                                      Возможно неудачно выразился. Смущает, что количество — это строка.
                                                      Контроля остатков и показа их — нет. Цен тут тоже нет и т.д. и т.п., тем не менее уже добавились дополнительные 10 строк кода, а форма выглядит как «привет из 1С 7.x» 94 года выпуска (хотя да, там бы пришлось больше строк кода написать — тут победа).


                                                      1. 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 года выпуска. Или вы реально думаете что раскрасив их поярче что-то изменилось.


                                                      1. Veidt
                                                        24.08.2019 18:31

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

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


                                                        1. Ta_Da
                                                          24.08.2019 19:20

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

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


                                                          1. Veidt
                                                            24.08.2019 19:40

                                                            Я уже неделю изучаю. Сверху приводили 5 разных форумов, где все говорят что нельзя так делать.

                                                            Но вы один утверждаете, что можно. И я все хочу выяснить как, может это какое-то секретное знание.

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

                                                            В любом случае не хотите, можете не отвечать, я вполне уверен, что был бы простой способ вы бы его привели. Это все что мне нужно было узнать. Лично вас я не переубежу, я это уже понял.


                                                      1. CrushBy
                                                        24.08.2019 20:28

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

                                                        Дело в том, что в B2B гораздо важнее не дизайн, а скорость работы. Так вот в веб-версии и 1С, и Dynamics, лично мне хочется чем-нибудь кинуть в монитор после пары минут работы, так как там на базовых простых действиях (типа открытия формы) висит по пару секунд и постоянно что-то «залипает». А если форма сложная, то вообще просто ужас. У нас есть клиенты, которые работают и с 1С и с lsFusion, так вот им тоже сначала не понравился дизайн. Но потом, когда привыкли, признали, что гораздо важнее то, что в lsFusion все летает.