Есть простая заполнялка накладной из файла Excel.
Пользователь указывает колонки артикула, количества, цены, суммы.
Заполнялка загружает в документ поступления.
Но есть нюансы.
Часто приходит УПД из 1С, где 100500 колонок (любимый нами MXL). И вот они тогда копируют оттуда в Excel-Шаблон загрузки. А хотелось бы находить колонки по наименованию в шапке.
А бывает что артикул и наименование в одной ячейке. Тогда хотелось бы как-то указывать не номер ячейки а номер, разделитель между токенами и номер в списке разделителей.
В общем, не хочу изобретать велосипед, может кто уже это проходил и поскажет направление решения.
(8) Но тут нужно уточнение. Самому автору ничего делать не надо. За него все сделают пользователи. Зайдут на сайт https://lmarena.ai, в раздел Direct Chat. Там чат с нейросетями, где можно прикрепить картинку. Пользователь зайдет, прикрепит эксельчик и напишет такой промт:
"Я прикрепил эксель-файл с товарной накладной, где есть табличная часть со следующими колонками:
Номенклатура, цена, количество, сумма. Нужно прочитать эту информацию из эксель-файла и вернуть в виде текста. Одна строка текста на каждую строку товарной накладной. Результат должен быть в виде:
Тапки;5;80
Ботинки;6;70"
Далее пользователь сохранит результат в текстовый файл и загрузит его в 1С с помощью обработки, которую напишет автор.
(1)
Во-первых не указана конфигурация.
Если конфа БП там есть стандартная загрузка накладных из файла п ( можно взять алгоритм оттуда)
Если не подойдет можно опять же использовать стандартный механизм загрузки из Excel с сопоставлением колонок ( например из документа Изменение элементов амортизации) . Встраивается достаточно легко, но логику заполнения ТЧ надо прописывать
(7) я им написал загрузчик. Но если вы видели современные УПД, там 100500 колонок, в экселе по умолчанию стиль ссылок не RC, а буковками, т.е. там получить номер колонки не просто. ну и часты явления, когда два значения в одной колонке.
(1) Представлю свой велосипед. Здесь у меня вызов функции НайтиНомераКолонок:
СтруктураНазванийПеременныхИНазванийКолонок=Новый Структура;
СтруктураПризнакОбязательностиКолонок=Новый Структура;
СтруктураНазванийПеременныхИНазванийКолонок.Вставить("НомерКолонкиPickupDateTime","Дата");
СтруктураПризнакОбязательностиКолонок.Вставить("НомерКолонкиPickupDateTime",Истина);
СтруктураНазванийПеременныхИНазванийКолонок.Вставить("НомерКолонкиCMN","cm");
СтруктураПризнакОбязательностиКолонок.Вставить("НомерКолонкиCMN",Истина);
СтруктураНазванийПеременныхИНазванийКолонок.Вставить("НомерКолонкиRUR","Стоимость");
СтруктураПризнакОбязательностиКолонок.Вставить("НомерКолонкиRUR",Истина);
СтруктураЗначенийПеременных=НайтиНомераКолонок(Worksheet,СтруктураНазванийПеременныхИНазванийКолонок,СтруктураПризнакОбязательностиКолонок,НомерСтрокиШапкиТаблицы,НомерПоследнейКолонкиШапкиТаблицы);
Если СтруктураЗначенийПеременных=Неопределено Тогда
ЗакрытьФайл(WorkBook,Excel);
Возврат;
КонецЕсли;
НомерКолонкиPickupDateTime=СтруктураЗначенийПеременных.НомерКолонкиPickupDateTime;
НомерКолонкиCMN=СтруктураЗначенийПеременных.НомерКолонкиCMN;
НомерКолонкиRUR=СтруктураЗначенийПеременных.НомерКолонкиRUR;
Показать
Вот сама функция НайтиНомераКолонок:
&НаКлиенте
Функция НайтиНомераКолонок(Worksheet,СтруктураНазванийПеременныхИНазванийКолонок,СтруктураПризнакОбязательностиКолонок,НомерСтрокиШапкиТаблицы,НомерПоследнейКолонкиШапкиТаблицы)
СтруктураЗначенийПеременных=Новый Структура;
Счетчик=1;
НазвКолонки=СокрЛП(Строка(Worksheet.Cells(НомерСтрокиШапкиТаблицы,1).Value));//ищем номера колонок
Пока Счетчик<=НомерПоследнейКолонкиШапкиТаблицы Цикл
Если Не ПустаяСтрока(НазвКолонки) Тогда
Для каждого стрПН из СтруктураНазванийПеременныхИНазванийКолонок Цикл
Если СокрЛП(НазвКолонки)=СокрЛП(стрПН.Значение) Тогда
СтруктураЗначенийПеременных.Вставить(стрПН.Ключ,Счетчик);
КонецЕсли;
КонецЦикла;
КонецЕсли;
Счетчик=Счетчик+1;
НазвКолонки=СокрЛП(Строка(Worksheet.Cells(НомерСтрокиШапкиТаблицы,Счетчик).Value));
КонецЦикла;
ВсеОбязательныеКолонкиНайдены=Истина;
Для каждого стрПрПН из СтруктураПризнакОбязательностиКолонок Цикл
Если НЕ СтруктураЗначенийПеременных.Свойство(стрПрПн.Ключ) Тогда
Если стрПрПН.Значение Тогда
ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Не найдена колонка """+СтруктураНазванийПеременныхИНазванийКолонок[стрПрПн.Ключ]+""". Возможно, в xls-файле эта колонка сейчас называется по-другому. "+Символы.ПС+
"Скопируйте название колонки из окна сообщения и вставьте в xls-файл. Это необходимо для полного совпадения ожидаемого и реального названия колонки в xls-файле.");
ВсеОбязательныеКолонкиНайдены=Ложь;
Прервать;
Иначе
СтруктураЗначенийПеременных.Вставить(стрПрПН.Ключ,0);
КонецЕсли;
КонецЕсли;
КонецЦикла;
Если Не ВсеОбязательныеКолонкиНайдены Тогда
Возврат Неопределено;
КонецЕсли;
Возврат СтруктураЗначенийПеременных;
КонецФункции
В линукс, в MacOS и в веб-клиенте работать не будет.
Ответ намекает на то, что у автора линукс, MacOS или веб-клиент. Какие основания так думать? Вроде автор такого не говорил.
Также автору советуют использовать 1С ЭДО. Также мне такой совет непонятен. Вероятность того, что автор не знает про 1С ЭДО, крайне мала.
Чем вы руководствуетесь, когда даете такие советы? Автору явно нужно что-то иное. Кстати, мой пост про нейросети тоже мимо. Скорей всего, я хотел помочь себе, когда это писал. Меня распирала гениальная, с моей точки зрения, идея, и я хотел ею поделиться.
(14) нейросети хороши, если их автоматизировать. Т.е. отправлять с пропмтом - извлеки из файла таблицу Артикул, Количество, Цена, Сумма без НДС, Сумма с НДС, НДС.
тогда да, она отработает и уже из таблицы выдаст данные. А так пользователям самим делать это не годится - квалификация нужна.
(13) давно надо перейти к чтению Excel через табличный документ. Я уже 100500 лет не использую Excel.Application. А чтение через ТД работает и в Линукс.
(19) у него нетленка. Поэтому нет даже стандартной команды "Загрузить из файла". В принципе, можно считывать из XML,, надо узнать, готовы ли поставщики давать в XML. Но часть все же будет в Excel.
Мне нужно просто дать пользователю возможность указать как разбирать ячейки и шапку простейшим образом, чтобы он сам записывал команды. Не хочется изобретать велосипед. Может кто делал.
(22) код я и сам мастер писать. Как пользователю это кодировать.
ну вот например если в колонке Артикул содержится артикул и наименование вместе, то можно написать так:
СОДЕРЖИТ Артикул Артикул Пробел Наименование
ГДЕ Артикул Артикул - т.е. колонка Артикул там, где встречается ячейка Артикул
ГДЕ Артикул Артикул* - т.е. колонка Артикул там, где встречается ячейка начинающаяся с текста Артикул
В итоге описание будет типа текста (языка для пользователя):
ГДЕ Артикул Артикул
СОДЕРЖИТ Артикул Артикул Пробел Наименование
или
КОЛОНКА Артикул 5 - обозначает что артикул в колонке 5
Или даже
КОЛОНКА АртикулНаим 5 - это колонка 5
СОДЕРЖИТ АртикулНаим Артикул Пробел Наименование - отсюда извлекаем артикул.
Т.е. что то вроде мини языка
Ну или напротив номера каждой колонки еще две ячейки - где искать в шапке по какой маске и какой по счету токен брать из ячейки. Тоже вариант, довольно простой, без языка.
Не, я спрошу у вас. Люблю комфорт, когда никуда лазить не надо.
Некий опыт общения на форуме я уже приобрел. Если вы всерьез начнете раздражаться, то просто перестанете мне отвечать.
(36) Я спросил у чат гпт, что означает термин нетленка в 1с сообществе.
Ответ чат гпт:
Таким образом, термин «нетленка» указывает на ценность определенных решений в экосистеме 1С, которые продолжают оставаться значимыми и полезными на протяжении долгого времени.
(43) Вы хотели, чтобы я под вас подстроился? Что бы я сделал вам удобно, а мне нет? Вам не на что жаловаться. Вы же сами честно сказали, что приходите сюда потроллить. Это все равно что носить футболку с надписью "Меня можно бить". Не вопрос.
(40)
https://netlenka.org Надежная защита ваших разработок.
Защита конфигурации 1С основана на обфускации или запутывании текстов модулей и работает без использования внешних компонент.
Просто скопируйте текст модуля в окно браузера и нажмите одну кнопку. Все, модуль защищен!
Нетленка у 1С ников означает, какая-то самописка, а не типовая конфа. Мог бы и у чатгпт узнать.
Если это был упрек, то он мне непонятен. Зачем мне лезть в окно, когда у меня есть ключ от двери, и я могу зайти через дверь?
Я задал вопрос, на форуме, на форуме же получил ответ. Зачем мне куда-то лазить?
Если тебе нравится доставлять неудобства себе и окружающим, то это твое дело.
Я хочу быть нормальным и жить нормально.
(11) ценность этого ответа близка к 0 бит. Дьявол в деталях. Много значит ничего. Понятно, что решений всегда много. Меня интересует решение задачи через призму вашего личного опыта, а не сообщение о "бороздящих космос космических кораблях". я о своем, о земном.
(25) размытый ответ на размытый вопрос.
У вас бывает так, сяк, откуда у вас вобще такие УПД - не ясно, у всех фирм упд на бумаге или в ЭДО. А если у вас частные случаи, то вы можете делать частные обработки. Только сначала надо приводить входные данные к какому-то единообразному виду. Иначе придётся каждый раз много вручную лопатить (чем вы видимо и занимаетесь). Через свои или итсные обработки реализуются загрузки из икселей. Это я и хотел сказать.
(35) как вы себе это представляете? Вычленить таблицы из Excel по объединенным ячейкам, т.е. сделать антисохранение в сетчатый Excel файл? это из пушки по воробьям. Задача не простая. Но если есть готовое решение, почему бы и нет.
Если вы предполагаете, что в конце или начале строки находится артикул, то просто получите первый и последний токен и проверьте поиском по артикулу (можно даже каждый)
Если Ваш пост дать ЧатГПТ, то он даст ровно те же советы, что сообщество, только быстрее и короче.
Формат УПД достаточно строго регламентирован, чтобы описать его и получить готовое алгоритмическое решение.
P.S. Рядом с нетленкой всегда можно написать еще одну, которая будет пережевывать информацию для старой.
Может ответ будет не популярным, но например разделить артикул и наименование в одной строке можно стандартной функцией самого экселя. Данные/текст по столбцам., а дальше грузить.
Если накладные скидываются шаблонно, то настроить внешний обработчик один раз и сохранить настройки.
НУ и самое банальное, это конечно же написать свою обработку, которая достаточно легкая и не будет стоить много денег и времени.
60.
user707563_igor_z50
28.01.25 20:49 Сейчас в теме
Мы просто адаптировали обработку "Загрузить из внешнего файла". Сделали через расширение конфигурации. Добавили адаптированную обработку в документ рядом со стандарной.
Пользователь приводит файл к формату xls или xlsx, можно убрать объединения ячеек. Это проще.
1. Но на форме добавляем возможность выбора внешнего файла только формата xls или xlsx.
2. Затем Пользователь сопоставляет колонки таблицы из файла с колонками основной формы для переноса, указывает диапазоны строк для загруки. Настройки можно сохранить, чтобы выбирать при получении файла с данными из того же источника.
3.Нажимает загрузку данных из таблицы, открывается стандартная форма, в которую переносятся только строки, у которых сопоставленная колонка количество имеет ненулевое значение (загрузка может быть из присланного клиентом прайс-листа, где только на части позиций проставлено количество, может в каком-то своем виде прислать).
Внешний вид во вложении.
Получилось просто, быстро и понятно для пользователей.