VOGBIT Пример создания плагина - Плагины
О новом модуле программы «Пролёживание» - Мнение руководителя производства

Последние темы на форумах VOGBIT

Импорт спецификаций из Excel - Общие вопросы
Balukov: Здравствуйте. Для работы с загрузкой спецификаций из файлов Excel,направляю Вам ссылку на документацию https://vogbit.ru/support/20647/ https://vogbit.ru/support/206 ...
"Расчётные документы" - Прочее
Константин Чилингаров: Здравствуйте, Нужно вытащить себе на панель инструментов кнопку. Для этого в любом месте на панели инструментов нажмите правую кнопк ...
Создание номенклатуры посредством "перетаскивания" в VOGBIT файлов - Общие вопросы
GlMax: Загрузить номенклатуру из Excel это здорово. Но кто же загрузит номенклатуру в Excel!? Если есть изделие разработанное в Компас, то как информ ...
Модуль для планирования - Производство
Константин Чилингаров: Можно на этот.
Учетные документы - Материалы, Комплектующие, Складской учёт
Валерий Бондаренко: Спасибо, слепой поиск очень помог.  Теперь по поводу сдачи на склад. Вогбит внедряли сначала на одном участке, там все так и организовано ...
Расчет плановых дат - Прочее
Андрей Тюрин: Будем ждать видео. Планирование производства -тема актуальная для нас.
Пример создания плагина - Плагины
Константин Чилингаров: Последние сообщения перенесены /forum/messages/forum24/topic2880/message17712/2880-sozdanie-nomenklatury-posredstvom-_peretaskivaniya_-v-vogbit-faylov#message17712 сюда . Причина: /forum/rules/ Правила ...
Сравнение производительности серверов - Прочее
Константин Чилингаров: Здравствуйте, Времена какие-то запредельные, на мой взгляд. Как по мне, для "расчёта" потребности минута - уже очень долго. Не говор ...
Расчет потребности материала из сменных заданий - Материалы, Комплектующие, Складской учёт
Zms.komissarov: Да, так и есть, не обновил строку и не увидел, что коэффициент пересчета указан для другого материала... Все работает! Спасибо!  
Восстановить учётные записи не срабатывает - Прочее
NPP_ORION: Разобрались, снимается вопрос.
Ошибка раскраски по приоритету - Ошибки в работе
Константин Чилингаров: Здравствуйте, Если кратко: 1. Нужно установить в настройках ручное назначение "приоритетов" (что пользователь сам проставляет &quo ...
Хранение в базе данных ссылок на файлы - Общие вопросы
Константин Чилингаров: Ещё штатный отчёт маршрутный лист с чертежом из PDF на обратной стороне у меня как-то не смог с первого раза сам сформироваться нормально, ...
Ошибка при печати отчёта - Отчёты
Константин Чилингаров: последнее сообщение /forum/messages/forum24/topic2877/message17694/2877-khranenie-v-baze-dannykh-ssylok-na-fayly#message17694 перенесено . Причина - нарушение /forum/rules/ правил форума , п.8.
Новые возможности. Объединённые задания. Как пользоваться? - Производство
Константин Чилингаров: Здравствуйте, Судя по данным вопросам, я понял, что Вы не поняли, как в принципе используется по задумке механизм "объединенных задан ...
Права Доступа Сотрудника - Прочее
Константин Чилингаров: Здравствуйте, Немного из истории вопроса…   В прошлой программе, которую мы делали до VOGBIT, была у нас «развесистая» система управл ...
Формат адреса прокси-сервера - Прочее
Владимир Белов: Добрый день! Нужно указывать в формате URL: http://170.70.0.1:3128 http http://170.70.0.1:3128 ://170.70.0.1:3128 У вас должен быть на прокси-сервере проброшен порт 28 ...
С Новым годом! - Общие вопросы
Сергей: На данный момент проблема решается повторной активацией серийного номера. Нужно нажать на кнопку "Повторить"
Совместимость с MS SQL Server - Общие вопросы
Владимир Белов: Добрый день! MSSQL 2008 не поддерживается. Минимальная поддерживаемая версия - 2012. Рекомендуемая - 2016 или более старшая.
Схема изготовления - Производство
Константин Чилингаров: А нет возможности из этого окна проверять наличие деталей на складе? Ну и выдавать их со склада, чтоб позиции "зеленели". Тут неск ...
И снова про брак... - Материалы, Комплектующие, Складской учёт
Константин Чилингаров: при нажатии на + в Связанных позициях, я ожидал(хотел) увидеть появление трёх позиций... Для этого нужно настроить, какие позиции должны ...

Пример создания плагина

Разработка приложений и функций - Плагины - Технические вопросы
Страницы: Пред. 1 2 3
Пример создания плагина
 
Коллекция. На входе номенклатура для которой создаётся ТП:
Код
long CreateManProcess(long nmkId)
{
   var ccs = ExtensibleApplication.Application.General.ComponentCollections(nmkId);
   var cc = ccs.AddNew();
   try
   {
      cc.Notation.Value = "Техпроцесс";
      cc.LinkTypeID.Value = //сюда ID типа связи с UID = LT_ManProcess>
      cc.StatusID.Value = //сюда ID статуса
      cc.Save();
   }
   finally
   {
      cc.Cancel();
   }

   return cc.ID.AsLongInt;
}

Компонент. На входе Id ТП и Id номенклатуры операции (в вашем случае tokarkaID):

Код
long AddOperation(long collectionId, long compNmkId)
{
   var comps = ExtensibleApplication.Application.General.Components(collectionId);
   var comp = comps.AddNew();
   try
   {
      comp.NomenclatureID.Value = compNmkId;
      comp.LinkTypeID.Value = //сюда ID типа связи с UID = LT_Operation>
      comp.Save();
   }
   finally
   {
      comp.Cancel();
   }
}

Параметр:
Код
ObjectParameter AddObjectParameter(long objectId, long parameterId, object parameterValue)
{
   var objectParameters = Utils.App.General.ObjectParameters(objectId);
   var objParam = objectParameters.AddNew();
   try
   {
      objParam.ParameterID.Value = parameterId;
      objParam.ParameterValue.Value = parameterValue;
      objParam.Save();
   }
   finally
   {
      objParam.Cancel();
   }
   return objParam;
}

Цитата
написал:
var zkz = ExtApp.Application.General.Nomenclature(КАКОЙ ID СЮДА ПИСАТЬ?, CatalogOptions.None).AddNew();
ID папки в которую вы хотите положить номенклатуру. Программе без разницы. Если вам тоже, то можно -1 написать. В таком случае будет создаваться в корне.

 
Не может почему-то присвоить ID, из-за чего так может быть?


void ExampleButtonActionExecute(object sender, ActionExecuteEventArgs e)
       {
           // ID 157337  - LT_ManProcess
           // ID 157141  - LT_Operation
           // ID 157138  - LT_MAN_CHART
           // ID 157720  - LT_Part
           //
           // ID 157205  - ST_Designing
           // ID 157206  - ST_InWork
           //
           // ID 157325  - T_OPR_HOUR
           // ID 159751  - VGB_Quantity

           long nmkID = 227610; // ID нашей детали 'Фланец'
           long oprID = 203301; // ID операции 'Токарная'

           long manID = CreateManProcess(nmkID, 157337, 157205);
           long comID = AddComponent(manID, oprID, 157141);
           AddObjectParameter(comID, 157325, 1);

           var zkz = ExtApp.Application.General.Nomenclature(-1, CatalogOptions.None).AddNew();
           zkz.Notation.Value = "1863 Роскосмос - Фланец"; // Наименование заказа

           var zkz_manID = CreateManProcess(zkz.ID.AsLongInt, 157138, 157206);
           var zkz_comID = AddComponent(zkz_manID, nmkID, 157720);
           AddObjectParameter(zkz_comID, 159751, 1);
       }


       long CreateManProcess(long nmkId, long linkID, long statusID)
       {
           var cc = ExtApp.Application.General.ComponentCollections(nmkId).AddNew();
           try
           {
               cc.Notation.Value = "Техпроцесс";
               cc.LinkTypeID.Value = linkID;
               cc.StatusID.Value = statusID;
               cc.Save();
           }
           finally
           {
               cc.Cancel();
           }
           return cc.ID.AsLongInt;
       }


       long AddComponent(long collectionId, long compNmkId, long linkID)
       {
           var comp = ExtApp.Application.General.Components(collectionId).AddNew();
           try
           {
               comp.NomenclatureID.Value = compNmkId;
               comp.LinkTypeID.Value = linkID;
               comp.Save();
           }
           finally
           {
               comp.Cancel();
           }
           return comp.ID.AsLongInt;
       }


       ObjectParameter AddObjectParameter(long objectId, long parameterID, object parameterValue)
       {
           var objParam = ExtApp.Application.General.ObjectParameters(objectId).AddNew();
           try
           {
               objParam.ParameterID.Value = parameterID;
               objParam.ParameterValue.Value = parameterValue;
               objParam.Save();
           }
           finally
           {
               objParam.Cancel();
           }
           return objParam;
       }
Bug.png (11.62 КБ)
Изменено: Dsolovjev - 11.03.2025 12:52:44
 
Код
zkz.Save();
 
Всех благодарю! У меня получилось создать заказ.
Хотелось бы ещё подсказку как удалить созданный мною заказ, т.к. при отладке плагина буду туда-сюда создавать один и тот же тестовый заказ и удалять его. И у меня нарисовалась проблемка, я прогнал тот же код что выше (заказ который создал - удалил перед этим вручную), только вместо статуса ST_InWork поставил ST_MAN_3, в надежде что таким образом сразу создадутся задания, но по итогу номенклатура уплыла в неизвестном направлении. Я решил найти её циклом и нашёл, но удалить не вышло. В Point_1 и Point_2 заходит, в Point_3 нет.

           foreach(var nmk in ExtApp.Application.General.Nomenclature(-1, CatalogOptions.None))
           {
               if(!nmk.Notation.IsNull)
               {
                   if((string)nmk.Notation.Value == "1863 Роскосмос - Фланец")
                   {
                       System.Windows.Forms.MessageBox.Show("Point_1");
                       foreach (var com in ExtApp.Application.General.ComponentCollections(nmk.ID.AsLongInt))
                       {
                           System.Windows.Forms.MessageBox.Show("Point_2");
                           // foreach (var prm in ExtApp.Application.General.Parameters(com.ID.AsLongInt, CatalogOptions.None))    // не заходит в цикл
                           // foreach (var prm in ExtApp.Application.General.Components(com.ID.AsLongInt, CatalogOptions.None))  // не заходит в цикл
                           // foreach (var prm in ExtApp.Application.General.LinkedObjects(com.ID.AsLongInt))                                    // не заходит в цикл
                           // foreach (var prm in ExtApp.Application.General.ObjectParameters(com.ID.AsLongInt))                              // не заходит в цикл
                           // foreach (var prm in ExtApp.Application.General.ComponentCollections(com.ID.AsLongInt))     // ссылка на объект не указывает на экземпляр объекта
                           // com.Count == 27
                           foreach (var prm in ExtApp.Application.General.ObjectParameters(com.ID.AsLongInt))
                           {
                               System.Windows.Forms.MessageBox.Show("Point_3");
                           }
                           com.Delete(); // Коллекция компонентов либо не существует, либо содержит компоненты.
                       }
                       nmk.Delete();
                       break;
                   }
               }
           }
Изменено: Dsolovjev - 12.03.2025 12:52:49
 
Думаю, что заходит и выходит т.к. набор данных пустой.
Цитата
написал:
// foreach (var prm in ExtApp.Application.General.Parameters(com.ID.AsLongInt, CatalogOptions.None))    // не заходит в цикл
Это получение данных из папки справочника параметров. Вместо ожидаемого ID папки, вы даёте на вход ID коллекции.

Цитата
написал:
// foreach (var prm in ExtApp.Application.General.Components(com.ID.AsLongInt, CatalogOptions.None))  // не заходит в цикл
Аналогично. Справочник компонентов. Для получения компонентов конкретной коллекции используйте
Код
ExtApp.Application.General.Components(collectionId);

Цитата
написал:
// foreach (var prm in ExtApp.Application.General.LinkedObjects(com.ID.AsLongInt))                                    // не заходит в цикл
Связанных объектов у коллекции, скорее всего, нет

Цитата
написал:
// foreach (var prm in ExtApp.Application.General.ObjectParameters(com.ID.AsLongInt))                              // не заходит в цикл
Параметров у коллекции, скорее всего, нет

Цитата
написал:
foreach (var prm in ExtApp.Application.General.ComponentCollections(com.ID.AsLongInt))     // ссылка на объект не указывает на экземпляр объекта
У коллекций не бывает своих коллекций. На вход ожидается Id номенклатуры
 
Не вижу смысла писать в таком случае свои "удалялки". Потеря времени. Проще и быстрее штатными функциями все поудалять в данном конкретном случае. Не так много насоздавали.

В сообщении #67 я Вам расписал кто как с кем связан в плане объектов в БД при создании. Удалять, как в любой базе данных, нужно "с конца".
Вы создали номенклатурную позицию (Заказ), к ней коллекцию компонентов (Карта заказа), в эту коллекцию добавили компоненты (Детали в карту заказа).
Номенклатура не удалится, пока у неё есть коллекции, коллекция не удалится пока в ней есть компоненты.
Соответственно, чтобы штатными средствами всё удалить:
1. Идем в общий справочник "Коллекции компонентов", находим там коллекцию - созданную Вами тех. карту (обычным поиском или авто-фильтром - по имени, по типу связи, как удобнее).
2. Открываем для этой коллекции зависимое окно "Компоненты". Всё там выделяем и удаляем.
3. Удаляем саму коллекцию (1).
4. Идем в общий справочник "Номенклатура", там (поиском, авто-фильтром, по обозначению или наименованию) находим созданную Вами номенклатуру "заказ". И удаляем её.

Всё. Готово.

По-моему проще руками так сделать в данном конкретном случае, чем "удалялки" писать.
Кстати, "Папка", куда складывать номенклатурную позицию "заказ" и коллекцию "карта заказа", что Вы спрашивали в сообщении #68 - они как раз и нужны, чтобы в случае задачи а-ля п. (1) и (4) искать не поиском по всему справочнику то, что вы насоздавали, а оно сразу лежало в конкретной папке и там вы его сразу и нашли при необходимости. Без папки поиском тоже найдётся. Но когда изначально известно, где лежит - проще.

Есть ещё админская утилита "Очистки заказов". Можно после п.(1), как альтернативный вариант вместо п. (2) и (3), встать в справочнике на нужную коллекцию (карту заказа, которую Вы создали) и в меню нажать "Настройка" - "Очистка заказов". Эта штука удаляет все из коллекции и саму коллекцию. Но более актуальна она, когда кроме деталей (компонентов) там ещё много чего есть (партии, назначенные ТП и т.д.). Чтобы руками всё это не удалять. В Вашем текущем случае - и руками, в принципе, не долго. Но можно и утилиту "Очистка заказов" задействовать. Готовая "удалялка" для "карт заказов".

Цитата
написал:
поставил ST_MAN_3
Самодеятельности тут не нужно  :D

Цитата
написал:
в надежде что таким образом сразу создадутся задания
Нет. "Создание заданий" это отдельный совершенно процесс причем, как минимум, на порядок более сложный, чем тот, который Вы сейчас пытаетесь воспроизвести и с кучей всяких нюансов (от статуса коллекции "Карта заказа" он никак не зависит). Самым настоятельным образом не рекомендую даже думать о написании своего плагина, который будет "создавать задания". Используйте штатную функцию в самом VOGBIT. Тем более, это одну кнопку нажать, и работает она сейчас - секунду от силы. И точно правильно, так как нужно. Писать свое "создание заданий" - тут точно овчинка выделки не стоит, как говориться. Сложно и непонятно зачем.
 
Добрый день! Нам всё таки понадобилась свойская удалялка. Внесли большой заказ, но часть номенклатур оказалась не корректной, замаялись удалять их вручную. В виде мусорных данных их там оставлять было не желательно. Я составил ф-цию удаления номенклатуры, но работает она как-то непонятно. Постоянно ругается на состояние объекта. Мне нужно чтобы ф-ция работала без багов, не вылетала. Смотрит плагин допустим по файловой системе или по списку какому-нибудь, ага - эту удалить надо со всеми её ветками и коллекциями, удалил и дальше пошел.
Код
    void DeleteNomenclature(string NomeclatureNotation)
        {
            foreach (var nmk in ExtApp.Application.General.Nomenclature(-1, CatalogOptions.None))
            {
                if (!nmk.Notation.IsNull)
                {
                    if ((string)nmk.Notation.Value == NomeclatureNotation)
                    {
                        foreach (var com in ExtApp.Application.General.ComponentCollections(nmk.ID.AsLongInt))
                        {
                            foreach (var prm in ExtApp.Application.General.Components(com.ID.AsLongInt))
                            {
                                prm.Delete();
                            }
                            com.Delete(); // спотыкается здесь, если процедура идёт сразу после удаления компонентов
                        }
                        nmk.Delete(); // спотыкается здесь, если процедура идёт сразу после удаления коллекций компонентов
                        break;
                    }
                }
            }
        }
 
Вариант 1: foreach заменить на for. Получится что-то типа:
Код
var coms = ExtApp.Application.General.ComponentCollections(nmk.ID.AsLongInt);
            for (var i = coms.Count - 1; i >= 0; i--)
            {
                var prms = ExtApp.Application.General.Components(coms[i].ID.AsLongInt);
                for (var index = prms.Count - 1; index >= 0; index--)
                {
                    prms[index].Delete();
                }
                coms[i].Delete(); 
            }
            nmk.Delete();
Вариант 2: Если надо удалить всё содержимое, можно использовать DeleteAll.
Код
 var collections = ExtApp.Application.General.ComponentCollections(nmk.ID.AsLongInt);
            foreach (var componentCollection in collections)
            {
                var comps = ExtApp.Application.General.Components(componentCollection.ID.AsLongInt);
                comps.DeleteAll();
            }
            collections.DeleteAll();

            nmk.Delete();
PS. Для поиска по номенклатуре не обязательно перебирать весь справочник.
PS2. Безотносительно к Вогбиту, я бы не рекомендовал использовать foreach для изменения коллекции внутри итерации
 
Здравствуйте, подскажите пожалуйста как работать с ExecutingHistoryRecord, и вообще что такое BizObject, это вроде, как я понял, номенклатуры, только какой-то более обобщённый объект. По мере развития нашего плагина, понадобилось залезть в состояние выполнения работ, только как это сделать не совсем понятно. Нам хотелось бы программно получать историю работ на конкретный компонент из заказа.
Код
foreach (ComponentCollection collection in ExtApp.Application.General.ComponentCollections(507445)) // 507445 - ID номенклатуры заказа
            {
                if (collection.LinkTypeUID.Value.ToString() == "LT_MAN_CHART")
                {
                    foreach (Component component in ExtApp.Application.General.Components(collection.ID.AsLongInt))
                    {
                        ExecutingHistoryRecord ExecHistory = new ExecutingHistoryRecord(component); // Здесь не может создать объект
                    }
                }
            }
Работы.png (28.78 КБ)
Bug.png (9.31 КБ)
 
Здравствуйте!

Цитата
понадобилось залезть в состояние выполнения работ
Зачем? Какую задачу Вы пытаетесь решить?

Тут надо понимать, что форма "История выполнения работ", которая у Вас на картинке - это, мягко говоря, совсем не "Номенклатура" какая-нибудь.
Если в формах типа "Номенклатура", "Подразделения" и т.п. просто, грубо говоря, что в таблице в базе лежит, то и выводится в виде колонок в гриде (утрированно), то тут сначала запросом добываются данные, из разных мест: из Task'ов, плановых трудовых ресурсов, фактических трудовых ресурсов, параметров и др. Причем в зависимости, например, от "уровня учёта" там из разных мест может добываться то, что в форме выводится в одной и той же колонке. И по "+" в этой форме совсем не "строчка" добавляется в некую "табличку", а создаётся куча разных объектов, перевязывается между собой: Task'и, параметры для них, заполняются плановые и фактические трудовые ресурсы и т.д. ещё много чего.
И там навешена попутно в этом процессе куча логики. Когда можно создавать, когда нельзя. Что именно создавать в какой ситуации. Что дальше ещё делать после того, как создали (например, если это "объединенное задание", то там ещё множество действий производится с теми, кого оно "объединяет"). В каком случае менять статусы, в каком не менять, на какой статус менять, кому статус менять. И т.д. и т.п....
В общем, такие формы - это уже, мягко говоря, не "Номенклатура", куда можно просто "добавить запись". Тут все сильно сложнее. Лезть туда самостоятельно без какой-то уж совсем крайней в этом необходимости настоятельно не рекомендуется.

Отсюда и вопрос: Зачем?
 
Цитата
Нам хотелось бы программно получать историю работ на конкретный компонент из заказа.
А что именно?
Там есть в общем случае: участок, операция (номер, название, комментарий), дата, смена, количество (сданное), фио работника, нормо-часы, время начала и окончания работ (не всегда, только в определенных случаях), признаки разные (по техпроцессу/не по техпроцессу задание выполнялось, наладка это была станка или изготовление деталей на уже налаженном станке), кто выдал задание/кто принял задание (не во всех случаях, только в некоторых это есть), разные комментарии, может быть (не всегда) станок, на котором выполнялось, может быть "пост" (при "высоком/максимальном" уровне). И ещё ряд вещей, но они уже используются только в некоторых достаточно "экзотических" случаях.
Что конкретно из этого вы хотите добыть программно?

Какой "уровень" вы используете? Одинаковый ли он у Вас для всех заданий, или разный, например, для разных "участков"?

Используете ли вы "объединённые" задания, или нет?
 
Мы в принципе решили ту задачу при помощи костылей и штатными средствами. Надо было поправить заказ, номенклатуры по внешнему списку, заказ в работе уже был и он на 700+ строк, а внесли мы его на скорую руку. Мы работаем на среднем уровне, задания не объединяем.

Вообще в этот раз я хотел бы поподробнее узнать про объект BizObject, что он из себя представляет, во что его можно конвертировать / преобразовывать.
 
BizObject - это абстрактный класс от которого унаследованы основные классы (номенклатура, компонент, задание, документ и т.д.)
В данном случаем объектом является BizObject из BizObjectList'a. BOL был получен в результате выполнения запроса с использованием ExtensibleApplication.Application.ExecuteQuery(query).
Пример с запросом есть на первой странице темы.
 
Есть вот такая строка:
Код
Nomenclature root = ExtApp.Application.General.Nomenclature(-1, CatalogOptions.None);
BizObject[] searchResult = root.QuickSearch(new[] { "Name" }, new object[] { name });

Чем отличается BizObjectList от BizObject[] ?

Если перебирать их циклом foreach отличия будут какие-нибудь?

Изменено: Dsolovjev - 14.08.2025 10:42:09
 
Цитата
написал:
Есть вот такая строка:
Код
 Nomenclature root = ExtApp.Application.General.Nomenclature(-1, CatalogOptions.None);
BizObject[] searchResult = root.QuickSearch(new[] { "Name" }, new object[] { name });
 
 Чем отличается BizObjectList от BizObject[] ?  Если перебирать их циклом foreach отличия будут какие-нибудь?
BizObjectList - это согласованный набор данных, что-то вроде таблицы, где строки таблицы - это BizObject'ы. При этом свойства BizObject'ов - это ячейки таблицы, а имена свойств - это названия столбцов. Коллекция строк (т.е. вся таблица) - это BizObjectList. BizObject не может быть создан и существовать без родительского ему BizObjectList.

BizObjectList согласованно загружается из БД и сохраняет в БД измененные BizObject'ы.  BizObjectList имеет такие методы, как AddNew(), DeleteAll(), SaveAll() и.т.д. для изменения и сохранения набора и т.д. В том числе BizObjectList реализует интерфейсы для перебирания содержащихся в нем BizObject'ов по индексу (цикл for) или с помощью энумератора (цикл foreach).

А BizObject[] - это просто массив со ссылками на объекты BizObject из BizObjectList. Как у любого массива, элементы можно перебрать с помощью циклов foreach или for. При этом удаление элемента из этого массива, например, удаляет только ссылку, но не сам BizObject, массив - это просто копия ссылок на объекты.  
 
Благодарю за развёрнутый ответ, что-то вроде этого я и хотел узнать, потихоньку по крупицам выстраивается у меня в голове концепция ваших API.

Теперь пытаюсь подгрузить материал в номенклатуру, но похоже что не всё правильно делаю. Есть у нас в базе значит номенклатура материала, ну я её и добавляю как компонент в коллекцию LT_ManProcess и ставлю компоненту статус LT_Material. Смотрю результат, вроде похоже, но не очень. В отличие от добавления вручную, строка не жирным шрифтом написана и расположена снизу, а не сверху. Как по нормальному сделать?

И второй вопрос: не могу почему-то удалить материал из тех-процесса строкой:
Код
ExtApp.Application.General.Components(componentCollection.ID.AsLongInt).DeleteAll();
 
Цитата
Есть у нас в базе значит номенклатура материала, ну я её и добавляю как компонент в коллекцию LT_ManProcess
Тут правильно. Материал добавляется в "техпроцесс детали" (коллекцию LT_ManProcess, у которой owner = номенклатура "детали"), как компонент с типом связи LT_Material.

Цитата
строка не жирным шрифтом
В окне "Технология подробно" жирным шрифтом выделяется, так называемый, "основной материал". Его может и не быть (например, в сборочных техпроцессах, "материалы" вполне могут фигурировать в ТП, но "основного материала" нет). В техпроцессах деталей "основным" материалом, чаще всего, является материал заготовки. Выделение какого-то материала, как основного, нужно для того, чтобы когда нужно показать на экране или вывести в отчёт "материал детали" (читай, материал заготовки), то программа понимала, а какой материал то из ТП брать/выводить, когда их в техпроцессе много разных указано (могут быть ещё запросто в ТП всякие проволоки, грунты, краски и т.п., и всё это "материалы").
Технически "основной материал" выделяется следующим образом. Берется компонент "материал" из техпроцесса и приделывается, как связанный объект к номенклатуре детали.
То есть, чтобы "строчка стала жирной" нужно после
Цитата
добавляю как компонент в коллекцию LT_ManProcess
взять этот компонент LT_Material, который вы только что создали в коллекции LT_ManProcess и его приделать, как связанный объект к номенклатуре детали с типом связи LT_Material.
Будьте внимательны!
Во-первых, не приделайте случайно что-нибудь не то или не туда.
Во-вторых, следите, чтобы не получилось ни в коем случае в результате действий вашего кода, например, более одного связанного объекта LT_Material у номенклатурной позиции детали. Чревато последствиями весьма неприятными и в самых на первый взгляд неожиданных местах.

Цитата
расположена снизу
Надо двигать компонент на нужное место в коллекции. В модуле, который отвечает за окно "технология подробно", достаточно развесистая и сложная логика прописана по части того, кто в каких случаях должен в какое место в ТП становиться при добавлении.

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

Цитата
следите, чтобы не получилось ни в коем случае в результате действий вашего кода, например, более одного связанного объекта
Мне тогда ещё коллекцию надо как-то получать связанных объектов. Можно поподробнее вообще про них? В чём есть суть связанного объекта? Как мне показалось, типы связей LT_... не всегда имеют силу и важное значение, например при приклеивании файла к номенклатуре, всё равно как его обозначать, рисунок/чертёж/спецификация. В чём разница между связями LT_... и связанными объектами?


Так пойдёт?
Код
                exists = false;
                foreach (LinkedObject obj in ExtApp.Application.General.LinkedObjects(colID))
                {
                    if ((long)obj.LinkTypeID.Value == LT_Material) { exists = true; break; }
                }
                if (!exists) {
                    mat_obj = ExtApp.Application.General.LinkedObjects(colID).AddNew();
                    mat_obj.ObjectID.Value = comp.ID.AsLongInt;
                    mat_obj.LinkTypeID.Value = LT_Material;
                    mat_obj.Save();
                }
Изменено: Dsolovjev - 19.08.2025 09:43:05
 
Связанные объекты - это механизм для установки в программе взаимосвязи любых двух объектов. Можно сказать, что "Объект Б" является связанным объектом "Объекта А". Используется данный механизм в плагинах очень много для чего и в разных местах.

Тип связи - определяет "как" связан в данном случае "Объект Б" с "Объектом А". Можно так сказать, тип связи определяет смысл этой связи. Что именно означает в данном конкретном случае эта связь между "А" и "Б".

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

На уровне самой базы данных, какой "тип связи" - не влияет ни на что. Какой хочешь такой и ставь. Дальше всё зависит от логики плагинов. Как они обрабатывают эту информацию, для чего используют.
Цитата
например при приклеивании файла к номенклатуре, всё равно как его обозначать
Это смотря для чего и с какой стороны посмотреть.
Если исходя из задачи, например, посмотреть в окне самого VOGBIT'а связанный файл, то да. Все равно какой тип связи.
А если исходя из задачи, к примеру, чтобы у оператора машины резки листового металла в момент взятия в работу задания на цеховом терминале в некоей заданной папке в сети появилась автоматически программа резки соответствующая, а потом после выполнения задания она автоматически из этой папки исчезла - вот тут совсем не все равно какой файл с каким типом связи "приделан к номенклатуре". Так что тут всё от задачи зависит...
 
Подскажите, как получить код штрих-кода на компонент в коллекции заказа. Нужны цифры (расшифровка). Я так понял там ID компонента + ещё одна какая-то рандомная цифра. Нужен код, независимо от того назначен штрих-код на компоненты или нет, ну наверное принудительное назначение тогда нужно.
 
Здравствуйте!

Функция "генерации штрих-кода" и вообще сам "штрих-код", как отдельный "объект" в программе нужны были в старых версиях VOGBIT. Когда не было нормального reporter'а, и для того, чтобы при распечатке в каком-нибудь маршрутном листе и т.п. был штрих-код, приходилось генерить специальный набор символов, которые потом, когда их определенным шрифтом выводишь, выглядели, как штрих-код.
Но это всё уже прошлый век.
Современный reporter, который последние несколько лет заменил в VOGBIT старый, он уже сам умеет печатать штрих-коды любой почти системы.
И всё это извращение с "генерацией", хранением в базе "штрих-кода" для некоего объекта отдельно - всё это уже не нужно.
Просто даёшь репортеру на вход цифру (чаще всего, это ID, если говорить о "графике производства" и всем что из него печатается, то в основном - ID компонента) и говоришь "напечатай мне вот это в виде штрих-кода". И всё, он сам печатает эту цифру (ID) в виде штрих-кода нужного тебе вида (стандарта).
Мы используем, в основном, для штрих-кодов стандарт EAN-13. Но пару раз делали для некоторых пользователей и другие, где ограничения EAN-13 мешали.

Цитата
+ ещё одна какая-то рандомная цифра
Это не "рандомная" цифра, а контрольная.

Если зачем-то интересно, как из числа формируется штрих-код, например EAN-13 - сам алгоритм, то это всё открыто, можно легко найти в интернете.
 
Добрый день. Как получить список всех заказов находящихся в работе?

Вот так вот не вариант, очень долго... Может есть какой-нибудь более правильный способ?
Код
            Nomenclature root = ExtApp.Application.General.Nomenclature(-1, CatalogOptions.None);
            foreach (NomenclatureItem nmk in root)
            {
                foreach (ComponentCollection collection in ExtApp.Application.General.ComponentCollections(nmk.ID.AsLongInt))
                {
                    if (collection.StatusUID.Value.ToString() == "ST_InWork")
                    {
                        System.Windows.Forms.MessageBox.Show(nmk.Notation.Value.ToString());
                        break;
                    }
                }
            }
 
Здравствуйте!
Способ первый. Поиск в справочнике по набору свойств
Код
            var ccs = ExtApp.Application.General.ComponentCollections(-1, CatalogOptions.None);
            var sr = ccs.QuickSearch(new[] { "StatusUID" }, new object[] { "ST_InWork" });
            foreach (ArrangedComponentCollection cc in sr)
            {
                Debug.WriteLine($"{cc.NomenclatureNotation.AsString} {cc.NomenclatureName.AsString}");
            }
Способ второй. Получаем данные с помощью запроса
Код
            var ccSqlQuery = new SqlQuery();
            var selectQuery = ccSqlQuery.CreateQuery();
            var collections = selectQuery.From.AddView<QB.Schema.Views.ComponentCollections>();
            selectQuery.Where.EqualTo(collections.StatusUID, "ST_InWork");
            selectQuery.Columns.Add(collections.NomenclatureNotation);
            selectQuery.Columns.Add(collections.NomenclatureName);
            ccSqlQuery.Add(selectQuery);

            var ccBol = ExtApp.Application.ExecuteQuery(ccSqlQuery);
            foreach (BizObject cc in ccBol)
            {
                Debug.WriteLine($"{cc["NomenclatureNotation"].AsString} {cc["NomenclatureName"].AsString}");
            }
 
Последние сообщения перенесены сюда.

Причина: Правила п.8
Страницы: Пред. 1 2 3
Сейчас на форуме
Всего зарегистрированных пользователей: 4505
Приняло участие в обсуждении: 437
Всего тем: 804
Всего сообщений: 6067

×
Вход на сайт