shard

279
Рейтинг

shard



  •   Регистрация: 23.03.2007 (17 лет назад)

  •   Был(а) на сайте: 24.04.2024

Друзья
  • Елена Бабушина
  • Дмитрий Малышев
  • Александр Шипков
  • Евгений Комиссаров
  • Гордей Голиков
  • Дмитрий Петров
  • Андрей Волин
  • Ирина Беляева
  • Виталий Ангелов
  • Юрий Лазаренко
Подписчики 10

Группы

Профессиональный разработчик

Рейтинг 279

Оптимизация хардкода

Инструменты и обработки Программист Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m) Расширение (cfe) Рефакторинг и качество кода

Очередной раз о наболевшем, или как использовать конфигуратор без программиста.

1 стартмани

07.12.2022    2588    1    shard    44       

5

Заполнение справочника "Виды алкогольной продукции" УТ 11.1

Инструменты и обработки Для всех Платформа 1С v8.3 1С:Управление торговлей 10 Оптовая торговля, дистрибуция, логистика Управленческий учет Windows Абонемент ($m) Внешняя обработка (ert,epf) Мастера заполнения

Обработка позволяет заполнить коды и наименования справочника "Виды алкогольной продукции" в УТ 11.1 из файла базы данных программы Декларант-Алко. Данная обработка на 99% основана на публикации http://infostart.ru/public/338984/

1 стартмани

30.09.2015    12086    8    shard    1       

0

Комментарии

НовостиКак определить, что вашему 1С:ITIL нужен веб-портал#3 26.02.24 22:40
(2) Благодарю за содержательный ответ, идеи понятны.
НовостиКак определить, что вашему 1С:ITIL нужен веб-портал#1 24.02.24 11:59
Цитата
Альтернативный веб-клиент для платформы 1С:Предприятие ... Веб-интерфейс быстрее тонкого клиента – в 1,8 раз, веб-клиента – в 2,6 раз
и быстрая(???) установка за 2 часа. Что-то не заметил чтобы интерфейс был быстрее в 2,5 раза на демостенде https://digitcat.ru/demo/ipc-itil/
где результаты замеров? за счет чего достигается такое увеличение скорости работы интерфейса? почему на демостенде каждый раз при переходе по формам выполняется подключение к БД (например при закрытии формы профиля пользователя без сохранения)?
ПубликацииЧтение содержимого zip-архивов для zakupki.gov.ru#0 20.02.24 11:00
Еще одна вариация zip-архиватора, извлекающего текстовое содержание запакованных файлов напрямую в переменную.
ПубликацииДля чего используют конструкцию запроса "ГДЕ ЛОЖЬ" в СКД на примере конфигурации 1С:ERP#11 14.02.24 1:01
и почему же не используют схему запроса... (сарказм)
AdminСвертка баз. Новый взгляд#39 13.01.24 23:55
(38) Файл данных (.mdf) примерно 150гб. Номенклатуры порядка 150-200к элементов (научили деятелей грузить все подряд). Также желательно было совместить свертку с переводом на онлайн-взаиморасчеты (ут11). После свертки и включения онлайн-взаиморасчетов файл данных стал около 80гб. Технологическое окно - примерно 88 часов (выходные+праздник), использовано порядка 8-10 часов (без учета написания обработок). Франчи, которых руководство считало прямо суперменами 1с (контора достаточно на слуху, но не 1бит), на работы (без учета написания обработок) закладывали примерно месяц. Ситуацию усугубляло некорректное закрытие регистров накопления, что например приводило к накоплению ошибочных записей в итогах РН заказов клиентов (порядка 700к лишних записей).
В вашем случае я бы попробовать перевести базу в sql для свертки, а потом вернуть к файловому варианту. Судя по публикации https://infostart.ru/1c/articles/1838362/ проблема была известна с апреля ;)
AdminСвертка баз. Новый взгляд#37 13.01.24 16:44
(36) Кажется понял идею. За счет фрагментации до документа сворачиваемых данных - будет хорошо отрабатывать в рабочее время, особенно при высокой степени совпадения движений разного знака у пары документов (например пары заказ клиента - реализация по РН заказов клиента). Но общее число операций записи в базу увеличится конечно, а за ним и общее время свертки. Надеюсь работе пользователей не будут мешать транзакции при свертке записей РН остатков товаров или взаиморасчетов. Стал бы сам такое применять - сомневаюсь, в последний раз предпочел единовременно записать остатки по РН в документ корректировки, средствами sql очистить ненужные движения а потом средствами sql же установить пометки удаления (Примерно 10 лет за пару часов вышло, количество документов не считал).
AdminСвертка баз. Новый взгляд#34 13.01.24 13:34
(31) в моей практике однажды было, что пока обрабатывались 2 корректировки регистров, отвечающие за остатки (проведение актуального и распроведение неактуального, общее время порядка 7 минут) один шустрый менеджер успел выставить счет клиенту на фактически отсутствующий на складе товар, дозвониться менеджеру клиента и чуть ли не получить оплату счета. Очень хороший менеджер по продажам, мда...
AdminСвертка баз. Новый взгляд#32 13.01.24 8:46
(30)
Цитата
Есть предложение любой документ заменить на документ "Корректировка записей регистров". Корректировка останется, а документ можно распровести без потери остатков
Цитата
Самое узкое место в классической свертки - долгое распроведение документов - таким образом будет обойдено
Похоже на противоречие. За счет чего очищаются движения документов, преобразовываемых в корректировку?
Цитата
Замещение документов в Корректировку - происходит с помощью обработки "Конвертация Документа В Корректировку". При этом все движения документа переносятся в Корректировку
Перенос движений - как он происходит? Даже если предположить что при выбранном подходе в записях (движениях) регистров меняется существующий регистратор на документ корректировки, то будет три записи (события) в регистр: запись общей суммы приходов, запись общей суммы расходов и запись итоговой свернутой суммы. В классической свертке сразу пишется итоговая свернутая сумма. Чего-то я не понимаю, солидарен с (7)
DevСортировка в табличной части (таблица значений) формы управляемого приложения#7 13.01.24 0:49
(6) недооценил коварство коллег: колонки могут быть содержащие собственно реквизит табличной части, содержащие реквизит реквизита табличной части добавленные в конфигураторе и добавленные в режиме предприятия через изменение формы. Исправил код для обработки описанных трех случаев, добавил комментарии:
Код
&AtClient
Procedure SortBL(Command)
   if not CurrentItem.CurrentData=Undefined then 
      CurrentItem.CurrentRow = SortBLAtServer(CurrentItem.Name,CurrentItem.CurrentItem.Name,
         ?(StrFind(Command.Name,"DESC")>0,"DESC","ASC"), CurrentItem.CurrentData.LineNumber-1);
   endif;
EndProcedure

&AtServer
Function SortBLAtServer(ItemName, ColumnName, DirSorting, CurrRow)
   ItemForm = FormAttributeToValue("Object");
   TableObject = ItemForm[ItemName];
   
   ColumnFormField = Items[ItemName].ChildItems.Find(ColumnName); // для проверки на случай сортировки по колонкам реквизитов реквизитов, добавленным в конфигураторе
   if ColumnFormField=Undefined then // случай сортировки колонки, содержащую реквизит реквизита табличной части и добавленную через изменение формы в предприятии
      AttibuteNameArray = StrSplit(StrReplace(ColumnName,ItemName,""),"_"); // здесь разделитель "_" и дополнительно нужно убрать имя табличного поля из начала имени колонки
   else
      AttibuteNameArray = StrSplit(ColumnFormField.DataPath,".");
      if AttibuteNameArray.Count()=3 then // случай сортировки колонки, содержащую реквизит табличной части, их всегда 3: объект, имя табличного поля и имя нужного реквизита
         CurrRowID = TableObject[CurrRow]; // запомнили текущую выделенную строку
         TableObject.Sort(AttibuteNameArray[2]+" "+DirSorting);
         ValueToFormAttribute(ItemForm,"Object");
         return TableObject.IndexOf(CurrRowID); // вернем позицию выделенной ранее строке
      else // случай сортировки колонки, содержащую реквизит реквизита табличной части и добавленную в конфигураторе
         AttibuteNameArray = StrSplit(ColumnFormField.DataPath,".");
         AttibuteNameArray.Delete(0); // удаляем элемент "объект"
         AttibuteNameArray.Delete(0); // удаляем элемент с именем табличного поля
      EndIf;
   endif;
   
   VT = TableObject.Unload(); // создаем вспомогательную таблицу
   VT.Columns.Add("AdditionFieldForSorting"); // интерактивная сортировка всегда по одной колонке, имя назначим служебное
   CurrRowID = VT[CurrRow]; // запомнили текущую выделенную строку. Во вспомогательной таблице, чтобы ИД строки был от сортируемой таблицы
   MainValueName = AttibuteNameArray[0]; // имя реквизита табличной части, значения реквизитов которого нужно сортировать
   AttibuteNameArray.Delete(0); // удаляем элемент, реквизиты которого получаем
   
   ValuesArray = VT.UnloadColumn(MainValueName); // формируем массив ссылок для получения значений реквизита и формируем соответствие ссылка-значение
   Query = New Query("SEL ECT Ref, " + StrConcat(AttibuteNameArray,".") + " AS AttributeName FR OM " + ValuesArray[0].Metadata().FullName() + " AS T WHERE T.Ref IN (&RefArray)");
   Query.SetParameter("RefArray", ValuesArray);
    Selection = Query.Execute().Select();
   MapValues = New Map;
   While Selection.Next() Do
      MapValues.Insert(Selection.Ref, Selection.AttributeName);
   EndDo;

   for each str in VT do // заполняем значения для сортировки
      str.AdditionFieldForSorting = MapValues[str[MainValueName]]; 
   enddo;               
   
   VT.Sort("AdditionFieldForSorting "+DirSorting); // сортировка по служебной колонке
   TableObject.Load(VT);
   ValueToFormAttribute(ItemForm,"Object");
   return VT.IndexOf(CurrRowID); // вернем позицию выделенной ранее строке
EndFunction

Название команды должно содержать ASC или DESC, иначе следует переписать определение направления сортировки в функции SortBL
DevСортировка в табличной части (таблица значений) формы управляемого приложения#6 12.01.24 16:09
Прошу прощения за мой англицкий, но пришлось наваять такое (но такова политика партии):
Код
&AtClient
Procedure SortBL(Command)
     CurrRow = CurrentItem.CurrentRow;
      if Command.Name="SortDESC" then
          SortBLAtServer(CurrentItem.Name,CurrentItem.CurrentItem.Name,"DESC", CurrRow);
      else
          SortBLAtServer(CurrentItem.Name,CurrentItem.CurrentItem.Name,"ASC",  CurrRow);
      endif;
      CurrentItem.CurrentRow = CurrRow;
EndProcedure

&AtServer
Procedure SortBLAtServer(ItemName,ColumnName,val DirSorting, CurrRow)
   ItemForm = FormAttributeToValue("Object");
   TableObject = ItemForm[ItemName];
   VT = TableObject.Unload();
   ColumnSort = VT.Columns.Find(ColumnName);
   CurrRowID = VT[CurrRow];
   if ColumnSort<>Undefined then
      TableObject.Sort(ColumnName+" "+DirSorting);
   else
      AttibuteNameArray = StrSplit(Items[ItemName].ChildItems.Find(ColumnName).DataPath,".");
      AttibuteNameArray.Delete(0);
      AttibuteNameArray.Delete(0);
      MainValueName = AttibuteNameArray[0];
      ValuesArray = VT.UnloadColumn(MainValueName);
      AttibuteName = StrConcat(AttibuteNameArray,"_");
      AttibuteNameArray.Delete(0);
      VT.Columns.Add(AttibuteName);
      MapValues = ObjectsAttributeValues(ValuesArray, StrConcat(AttibuteNameArray,"."));
      AttibuteNameInMap = StrConcat(AttibuteNameArray,"");
      for each str in VT do
         str[AttibuteName] = MapValues[str[MainValueName]][AttibuteNameInMap];
      enddo;
      VT.Sort(AttibuteName+" "+DirSorting);
      TableObject.Load(VT);
   endif;
   CurrRow = VT.IndexOf(CurrRowID);
   ValueToFormAttribute(ItemForm,"Object");
EndProcedure

&AtServerNoContext
Function ObjectsAttributeValues(RefArray, AttributeNames) Export
   
   AttributeValues = New Map;
   If RefArray.Count() = 0 Then
      Return AttributeValues;
   EndIf;
   
   Query = New Query;
   Query.Text =
      "SEL ECT
      |   Ref AS Ref, " + AttributeNames + " FR OM " + RefArray[0].Metadata().FullName() + " AS Table
      | WHERE Table.Ref IN (&RefArray)";
   Query.SetParameter("RefArray", RefArray);
   
   Selection = Query.Execute().Select();
   While Selection.Next() Do
      Result = New Structure(StrReplace(AttributeNames,".",""));
      FillPropertyValues(Result, Selection);
      AttributeValues[Selection.Ref] = Result;
   EndDo;
   
   Return AttributeValues;
   
EndFunction

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