Некоторые картинки не загружаются из РФ и РК, используйте VPN.
Показаны сообщения с ярлыком . Показать все сообщения
Показаны сообщения с ярлыком . Показать все сообщения

пятница, 30 января 2026 г.

1С Удалить записи регистра по отбору

2026 год, УТ 11.5.22.137, помеченный на удаление документ "Передача товаров между организациями" имеет движения в регистре "Резервы товаров организаций". Очистка ТЧ Товары, добавление левого товара и проведение создают набор записей, согласно списку товаров. Отмена проведения возвращает старые записи, хотя в ТЧ товары их нет. При этом отключение контроля остатков (галка и кнопка на время сеанса) никак не влияет. Разбираться было лень, накидал обработку и удалил записи вручную.



На коленке, за сообщить на сервере не бить, работает, меня устраивает


&НаСервере
Процедура УдалитьЗаписиНаСервере()
	Если НЕ ЗначениеЗаполнено(СсылкаДокумент) Тогда
		Сообщить("Не задан регистратор");
	КонецЕсли;
	Набор = РегистрыНакопления.РезервыТоваровОрганизаций.СоздатьНаборЗаписей();
	Набор.Отбор.Регистратор.Установить(СсылкаДокумент);
	Набор.Прочитать();	
	КолВо = Набор.Количество();
	Если КолВо > 0 Тогда
		Набор.Очистить();
		Набор.Записать(Истина);
	КонецЕсли;	
	Сообщить("Обработано "+КолВо+" записей");
КонецПроцедуры

&НаКлиенте
Процедура УдалитьЗаписи(Команда)
	УдалитьЗаписиНаСервере();
КонецПроцедуры

четверг, 15 января 2026 г.

1С ЗУП 3.1 Полное наименование в отчетах

 

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

пятница, 29 марта 2024 г.

1С:Заготовка Поиск по GTIN номенклатуры при загрузке из ТабДокумента

Менеджер получил новые GTIN для продукции, которая уже заведена в 1С УТ и имеет собственный GTIN, при этом наименование товара также заменили в соответствии с новыми правилами ЧЗ. Плюс к списку прилагались 2000 марок к остаткам. Все было выполнено в специальной конфигурации Хамелеон. Бухгалтер попросила помочь с загрузкой марок в 1С УТ, так как  в УТ остаток есть, а приход размазан на год.

Самый простой вариант для разового варианта - ЗагрузкаДанныхИзТабличногоДокумента_УФ_v2.epf, но он не умеет находить по GTIN из коробки. А мне нужно:

  • Добавить GTIN к существующей карточке номенклатуры
  • Заменить наименования в карточке
  • Загрузить марки в базу
Поэтому я воспользовался возможностью Вычислить


Вот такой код:

М = РегистрыСведений.ШтрихкодыНоменклатуры.СоздатьНаборЗаписей();
М.Отбор.Штрихкод.Установить(?(СтрДлина(ТекстЯчейки)=13,ТекстЯчейки,строка("0"+ТекстЯчейки)));
М.Прочитать();
Результат=М[0].Номенклатура;
Сообщить(М[0].Номенклатура);

Да, код не оптимален, но для разовой загрузки подойдет, ибо на загрузку в таком варианте ушло не больше 20 минут (вспомнить как писать на 1С тоже занимает время X-D), а на разработку полноценного решения ушло бы часа 2 О_О

Один момент, для исправления наименования GTIN помещаем в поле Код, для поля код ставим галку поле поиска, а алгоритм вычисления кода правим вот так:

М = РегистрыСведений.ШтрихкодыНоменклатуры.СоздатьНаборЗаписей();
М.Отбор.Штрихкод.Установить(?(СтрДлина(ТекстЯчейки)=13,ТекстЯчейки,строка("0"+ТекстЯчейки)));
М.Прочитать();
Результат=М[0].Номенклатура.Код;
Сообщить(М[0].Номенклатура);

воскресенье, 11 февраля 2024 г.

Script Posh Сформировать список файловых баз 1С рекурсивно

Переношу 1С с одного сервера на другой, основные базы были клиент-серверные, переводим в файловую и добавляем в список. Делов на пять минут, так как их не много. А вот в файловых базах целая туча без логики во вложенности. Решил накидать скрипт, который сам сформирует список баз. Скрипт проходит рекурсивно, ищет файл базы 1Cv8.1CD и строит дерево. Если в каталоге нет файла БД и нет подкаталогов, то пропускает, во всех остальных случаях добавляет в файл списка баз. Из за этого возможны пустые каталоги

$Folder="D:\1C_BASES\Базы1с_8"
$filev8i="$Folder\bases_here.v8i"
$level=1

function CheckName{
    param(
        [Parameter()]
        [string]$Name,

        [Parameter()]
        [string]$File,

        [Parameter()]
        [int]$cnt=1
    )
    $content=$(Get-Content $File)
    if ($content | Select-String -Pattern "[$Name]" -SimpleMatch -Quiet){
        $cnt=$cnt+1
        $res=$(CheckName -Name "$Name ($cnt)" -File $file -cnt $cnt)   
    }else{
        $res=$Name
    }
    return $res
}
function GetTree{
    param(
        [Parameter()]
        [string]$Folder,

        [Parameter()]
        [string]$Parent="",

        [Parameter()]
        [int]$level
    )
     
    $ChildList=$(Get-ChildItem -Path $Folder -Directory)
    

    foreach ($child in $ChildList){
        $FullPath=$($child.FullName)
        $NameParentFolder=$Parent

        if (Test-Path "$FullPath\1Cv8.1CD"){
            $pref="-"*$($level)+"|->"
            Write-Host("$pref Folder `"$child`" with 1C Bases")

            $Name=$(CheckName -Name $child -File $filev8i)

            $Text=@"
[$Name]
Connect=File=`"$FullPath`";
ID=
OrderInList=
Folder=$($NameParentFolder.Replace("\","/"))
OrderInTree=
External=0
ClientConnectionSpeed=Normal
App=Auto
WA=1
Version=8.3
AppArch=Auto
DisableLocalSpeechToText=0
DisableLocalSpeechToText=0

"@

            Write-Output($text) | Out-File -Encoding "UTF8" $filev8i -Append
        } else {
            if ($(get-childitem $FullPath -Directory).count -gt 0){
            $pref="-"*$level+"|->"
            Write-Host("$pref Folder `"$child`":")
            $Name=$(CheckName -Name $child -File $filev8i)
$text=@"
[$name]
ID=
Folder=$($NameParentFolder.Replace("\","/"))

"@
            Write-Output($text) | Out-File -Encoding "UTF8" $filev8i -Append
            GetTree -Folder $FullPath -Parent "$NameParentFolder\$name" -level $($level+1)
            } else {
                $pref="-"*$level+"|->"
                Write-Host("$pref Folder `"$child`" not contain subfolders") 
            }
        }
    }
}
Remove-Item -Path $filev8i -Force
$currentParent=$(($Folder.Split("\"))[-1])
$text=@"
[$currentParent]
ID=
Folder=/

"@
Write-Output($text) | Out-File -Encoding "UTF8" $filev8i -Append

GetTree -Folder $Folder -level $level -Parent "/$currentParent"

Скрипт мою задачу решил, наводить лоск смысла не вижу смысла

воскресенье, 30 апреля 2023 г.

1С Форма выбора возвращает номер строки

 Вот вроде не первый раз, а столкнулся с такой ошибкой как новичок. Но тут оказалась не одна ошибка, а несколько:

  1. Событие ОбработкаВыбора() для ТЧ висела на форме
  2. Событие ОбработкаВыбора() не имело проверки полученного значения
  3. Изменил запрос динамического списка без указания основной таблицы
Пока не указал основную таблицу - получал номер строки от формы выбора. Но, если нельзя указать основную таблицу, то нужно воспользоваться ОповещениеОВыборе()

пятница, 21 апреля 2023 г.

1С настройка списков баз

Есть куча разных способов настройки списков баз 1С, некоторые не очевидны, а некоторые банальны и просты, все зависит от целей и задач.


Каждому пользователю свой список

Это самый простой способ, который осилит каждый пользователь.

Плюсы:

  • Быстро
  • Без заморочек

Минусы

  • Через некоторое время будет куча мусора
  • Нельзя обновлять список сразу у всех (ну кроме скриптов)

Общий список через симлинк

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

Для реализации создаем структуру каталогов

  • C:\cache_1c\
    • Roaming\1C
    • Local\1C

потом удаляем у пользователей:

  • C:\users\%username%\Appdata\
    • Roaming\1C
    • Local\1C
И создаем соответствующие симлинки:
C:\windows\system32\>mklink /D C:\users\%username%\Appdata\Roaming\1C C:\cache_1c\Roaming\1C
C:\windows\system32\>mklink /D C:\users\%username%\Appdata\Local\1C C:\cache_1c\Local\1C
При этом не забываем про то, что у указанных пользователей должен быть доступ на уровне записи в данный каталог, например для группы 1С, т.о. достаточно добавить пользователя в указанную группу и все будет работать. 
- "А почему мы даем симлинк не на файл с базами, а на весь каталог?"
Потому что у баз есть идентификаторы, и получится так, что у одной базы у разных пользователей будет одинаковый каталог с кэшем, в общем это не страшно, но места занимает уйму.
В теории возможно создать симлинк в "Default user", чтобы он создавался автоматом при первом входе, я даже вроде делал, но не помню прокатило или нет.
Данный вариант я использовал на терминале со списком из 90+ баз на 5 пользователей.

Плюсы:
  • Один раз настроил и забыл
  • Любое изменение видно у всех пользователей
Минусы:
  • С большим объемом нужно использовать группы, но включение дерева идет у каждого пользователя в отдельности (может и можно автоматизировать, но мне не так надо было)
  • Легко забыть как эта штука настроена

Общие списки баз

В настройках окна списка баз можно указать файлы со списками баз, данные списки нужно предварительно создать.
Плюсы:
  • Файл/ы со списками базами хранятся в одном месте и легко администрируются
  • Пользователь не может внести в него изменения (все изменения будут видны только у него)
Минусы
  • Для каждого нового пользователя требуется указание всех списков
  • Случайно можно дать доступ к файлу, к которому не нужен доступ конкретному юзверю

Общие списки баз расширенный вариант

В каталоге C:\Programdata\1c\1CEStart\ есть файл 1cestart.cfg, в этом файле можно указать общий конфигурационный файл директивой CommonCfgLocation, например C:\iBases\1cescmn.cfg, а в этом файле 1cescmn.cfg укажем наши списки баз (и еще кое какие параметры):
AppAutoInstallLastVersion=1
ConfigurationTemplatesLocation=E:\buh\aa\Templates
UseHWLicenses=1
CommonInfoBases=E:\1C Bases\iBases\Production.v8i
CommonInfoBases=E:\1C Bases\iBases\Generate.v8i
CommonInfoBases=E:\1C Bases\iBases\City.v8i
CommonInfoBases=E:\1C Bases\iBases\Pro.v8i
CommonInfoBases=E:\1C Bases\iBases\FinDir.v8i
CommonInfoBases=E:\1C Bases\iBases\NP.v8i
CommonInfoBases=Y:\OLD_Bases.v8i
Теперь все новые пользователи будут видеть все базы в этих списках. Крайне рекомендуется в списках делать группы.
Плюсы:
  • Файл/ы со списками базами хранятся в одном месте и легко администрируются
  • Пользователь не может внести в него изменения (все изменения будут видны только у него)
  • Любой новый пользователь видит все списки баз
Минусы:
  • Любой новый пользователь видит все списки баз, это к вопросу о знании расположения базы и ее названия (чаще всего название содержит наименование юр лица)

Общие списки баз СВЕРХрасширенный вариант

К предыдущем варианту добавляем еще явные разрешения на чтение самих файлов список баз, тогда у пользователя будут открываться только списки, к которым есть доступ.
Плюсы:
  • Файл/ы со списками базами хранятся в одном месте и легко администрируются
  • Пользователь не может внести в него изменения (все изменения будут видны только у него)
  • Пользователь видит только те списки, к которым у него есть доступ
У этого варианта есть еще один интересный плюс, если файл недоступен, то он и не подгружается, а значит можно отдельно подключать какой-нибудь диск с архивом (диск Y в примере).

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


Это один из самых красивых вариантов, но, опять же вид дерево надо включать самостоятельно. Настройка "Отображать в виде дерева" сюда не входит, для ее установки необходимо исправить в файле %AppData%\1C\1cv8\1cv8strt.pfl
"ShowIBsAsTree",
{"B",0}

на

"ShowIBsAsTree",
{"B",1}

пятница, 17 марта 2023 г.

1СЗаготовока запрос свободная секунда (список секунд за дату)

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

Функция ПолучитьДатуДокумента()
  Если НЕ ЭтоНовый() Тогда
    ШестьдесятСекундТЗ=Новый ТаблицаЗначений;
    ШестьдесятСекундТЗ.Колонки.Добавить("Секунд",Новый ОписаниеТипов("Число"));
    Секунд=0;
    Пока Секунд<=59 цикл
      ШестьдесятСекундТЗ.Добавить().Секунд=Секунд;
      Секунд=Секунд+1;  
    КонецЦикла;
      

    Запрос = Новый Запрос;
    Запрос.Текст = 
      "ВЫБРАТЬ
      |  секунды.секунд КАК секунд
      |ПОМЕСТИТЬ ШестьдесятСекунд
      |ИЗ
      |  &ШестьдесятСекунд КАК секунды
      |;
      |
      |////////////////////////////////////////////////////////////////////////////////
      |ВЫБРАТЬ
      |  ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&Дата, ДЕНЬ), СЕКУНДА, часов.часы * минут.минуты * секунд.секунды) КАК СекундаДня
      |ПОМЕСТИТЬ ДатаПоСекундам
      |ИЗ
      |  (ВЫБРАТЬ
      |    секунды.секунд КАК часы
      |  ИЗ
      |    ШестьдесятСекунд КАК секунды
      |  ГДЕ
      |    секунды.секунд <= 23) КАК часов,
      |  (ВЫБРАТЬ
      |    секунды.секунд КАК минуты
      |  ИЗ
      |    ШестьдесятСекунд КАК секунды) КАК минут,
      |  (ВЫБРАТЬ
      |    секунды.секунд КАК секунды
      |  ИЗ
      |    ШестьдесятСекунд КАК секунды) КАК секунд
      |;
      |
      |////////////////////////////////////////////////////////////////////////////////
      |ВЫБРАТЬ
      |  ВЫБОР
      |    КОГДА КоличествоДатТекущегоДокумента.Количество = 0
      |      ТОГДА &Дата
      |    ИНАЧЕ МИНИМУМ(ДатаПоСекундам.СекундаДня)
      |  КОНЕЦ КАК НоваяДата
      |ИЗ
      |  (ВЫБРАТЬ
      |    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ACG_ЗаказНаПроизводство.Дата) КАК Количество
      |  ИЗ
      |    Документ.ACG_ЗаказНаПроизводство КАК ACG_ЗаказНаПроизводство
      |  ГДЕ
      |    ACG_ЗаказНаПроизводство.Дата = &Дата
      |    И ACG_ЗаказНаПроизводство.Ссылка <> &Ссылка) КАК КоличествоДатТекущегоДокумента,
      |  ДатаПоСекундам КАК ДатаПоСекундам
      |ГДЕ
      |  НЕ ДатаПоСекундам.СекундаДня В
      |        (ВЫБРАТЬ РАЗЛИЧНЫЕ
      |          ACG_ЗаказНаПроизводство.Дата КАК Дата
      |        ИЗ
      |          Документ.ACG_ЗаказНаПроизводство КАК ACG_ЗаказНаПроизводство
      |        ГДЕ
      |          ACG_ЗаказНаПроизводство.Дата >= НАЧАЛОПЕРИОДА(&дата, ДЕНЬ)
      |          И ACG_ЗаказНаПроизводство.Дата <= КОНЕЦПЕРИОДА(&дата, ДЕНЬ))
      |
      |СГРУППИРОВАТЬ ПО
      |  КоличествоДатТекущегоДокумента.Количество";

    Запрос.УстановитьПараметр("Дата", Дата);
    Запрос.УстановитьПараметр("ШестьдесятСекунд",ШестьдесятСекундТЗ);
        Запрос.УстановитьПараметр("Ссылка",Ссылка);

    РезультатЗапроса = Запрос.Выполнить();

    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
      Если ВыборкаДетальныеЗаписи.Количество()=0 Тогда
      НоваяДата=Дата;
      Сообщить("Необходимо изменить время/дату документа, программно не получается - лапки");
    Иначе
      НоваяДата=РезультатЗапроса[0].НоваяДата;    
    КонецЕсли;
  ИНаче
    НоваяДата=ТекущаяДата();
  КонецЕсли;
  Возврат(НоваяДата);
КонецФункции

Банально и просто

среда, 22 февраля 2023 г.

1СОшибка смена криптопровайдера у подписи

 В некоторых случаях токен (ЭЦП, ключ подписи) можно использовать в режиме RDP с ключом в самом сервере. Я проверил работу этой штуки с использованием USB over IP от DistControl. И вот что вышло:

  1. В крипто про работает
  2. Через плагин Крипто про работает
  3. В 1С отчетность работает (через пару запросов он сам настроился)
  4. В 1С-ЭДО не работает 
  5. Контур.Диадок работает
  6. Онлайн.СБИС работает
  7. Госуслуги
Спойлер!!!
Онлайн СБИС на данный момент не поддерживает работу одновременно двух криптопровайдеров (System CSP и Cryptographic Service Provider), этот гад видит ключи только одного. Из-за этого мне пришлось отказаться от использования этого варианта, т.к. на ПК из 150 ключей, только двум нужен криптопровайдер System CSP
Спойлер!!!
  

При этом сертификат спокойно добавляется и проходит проверку на месте, при попытке же его использовать для получения/подписания документов, выпадет в ошибки диагностики:
  • требуемый сертификат не прошел проверку по сроку действия
  • ошибка при получении контекста модуля криптографии (0x8010006E)

пятница, 27 января 2023 г.

CMD Script Добавить правила файервола по маске 1cv*.exe

Говорят, если запретить 1С выход в интернет, то она работает быстрее. Сервисами чел не пользуется, так что решил на нем потренироваться и описал такой скрпит:

@echo off
set Prg="%systemdrive%\progra*"
SETLOCAL EnableDelayedExpansion
FOR /D %%i in ("!Prg!") do (
	FOR /D %%j in ("%%i\1cv8\8*") do (
		echo %%j
		set pathProg=%%j\bin
		set ver=!pathProg:*1cv8\=!
		FOR /F "tokens=*" %%k in ('dir /b "!pathProg!\1cv*.exe"') do (
			echo. %%k
			set nameEXE=!pathProg!\%%k
			set nameFW="Block1C_%%k_!ver!"
			netsh advfirewall firewall show rule name=!nameFW! >null && set RuleExist=1 || set RuleExist=0
			if  !RuleExist! EQU 0 (
				netsh advfirewall firewall add rule name="!nameFW!" dir=out program="!nameEXE!" profile=any action=block
			) else (
				echo.   Rule !nameFW! are exist
			)
		)
		echo.
	)
	echo.
)
SETLOCAL DisableDelayedExpansion

Что он делает - проверяет на наличие (по имени сформированному им самим) и добавляет, при отсутствии, правила блокировки для \Progra*\1cv8\8*\bin\1cv*.exe, т.е. неважно какая платформа, какая разрядность или какой клиент.

Вот так просто получаем список правил:


Как видим, задача решена простым перебором во вложенных циклах. Данный скрипт оставляю на память:

  1. Использование EnableDelayedExpansion для передачи значения перебора в/за цикл
  2. Программное добавление правил брандмауера Windows
  3. Костыльная передача результата команды в переменную (конструкция && ||)
  4. Циклы (перебор директории и результата программы)
  5. Cmd replace (!pathProg:*1cv8\=!) с подстановкой значений

1СОшибка УТ данные инн и кпп уже указаны для другого контрагента ответственный -

Ошибка обычная, но в моем случае она превратилась в маленький ад, потому как нигде этого контрагента нет. А точнее - его нет в видимых разделах, но на него есть невидимые ссылки в различных объектах. А консоль запросов показывает, но при попытке перейти по ссылке, открывается форма создания нового контрагента. ТиС не помог.

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

четверг, 26 января 2023 г.

1СЗаготовка СБИС сопоставление номенклатуры по наименованию

 Для УТ очень надо. Форма ФормаПросмотраДокумента. Добавить на форму Команду и связать с процедурой. Также добавить Булево Отладка или удалить кусок кода

//arshanskiyav+
&НаСервере
Функция НайтиНоменклатуруПоНаименованию(Наименование) 
	Номенклатура=Справочники.Номенклатура.НайтиПоНаименованию(Наименование,Истина);
	Возврат(Новый Структура("Номенклатура,ЕдИзм",Номенклатура,Номенклатура.ЕдиницаИзмерения));
КонецФункции
&НаСервере
Функция НайтиЕдИзмПоНаименованию(Наименование) 
	Возврат(Справочники.УпаковкиЕдиницыИзмерения.НайтиПоНаименованию(Наименование,Истина));
КонецФункции 
&НаКлиенте
Процедура СопоставитьПоНаименованию(Команда)
	//СопоставитьПоНаименованиюНаСервере();
	
	Для Каждого СтрокаТЧ Из ТабличнаяЧасть Цикл  
		Элементы.ТабличнаяЧасть.ТекущаяСтрока=СтрокаТЧ.ПолучитьИдентификатор();
		Если НЕ ЗначениеЗаполнено(СтрокаТЧ.Номенклатура) Тогда 
			ТабЧасть = сбисЭлементФормы(ЭтаФорма,"ТабличнаяЧасть");
			СбисСтрокаТабличнаяЧастьДоИзменения(МестныйКэш, ТабЧасть);
			
			НайденнаяНом=НайтиНоменклатуруПоНаименованию(СтрокаТЧ.Название);
			СтрокаТЧ.Номенклатура=НайденнаяНом.Номенклатура;
			Если ЗначениеЗаполнено(СтрокаТЧ.Номенклатура) Тогда
				СтрокаТЧ.ЕдИзмОрг=НайденнаяНом.ЕдИзм;
			КонецЕсли;
			Если НЕ ЗначениеЗаполнено(СтрокаТЧ.ЕдИзмОрг) и ЗначениеЗаполнено(СтрокаТЧ.ЕдИзм) Тогда
				СтрокаТЧ.ЕдИзмОрг=НайтиЕдИзмПоНаименованию(СтрокаТЧ.ЕдИзм);
			КонецЕсли;
			Если Отладка Тогда
				Сообщить(СтрокаТЧ.Название);   
				Сообщить(НайденнаяНом);
			КонецЕсли;    
			
			ТабЧасть = сбисЭлементФормы(ЭтаФорма,"ТабличнаяЧасть");
			СбисСтрокаТабличнаяЧастьПриИзменении(МестныйКэш, ТабЧасть);
			
		КонецЕсли;
	КонецЦикла;

КонецПроцедуры
//arshanskiyav-

Продуктивностью не отличается, т.к. сбисовские обработчики регистрируют каждое изменение в dbf, но это намного быстрее, нежели вручную!

пятница, 13 января 2023 г.

1СОшибка В сеансе существуют изменяющие расширения

 Как обычно, раз в квартал, обновлял РИБ, при том две. Конфигурации 1-в-1, расширение одно и оно идентично. Одна база обновилась ну всех узлах успешно, а вот подчиненный узел второй базы начал выеживаться, постоянно выдавая ошибки загрузки данных/применения новой конфигурации. Ничего не помогало, в итоге решил выгрузить свежий образ и:

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

Это было удивительно. Ладно, гугел указывает что ошибка аж с 2020 года существует, поставил самую свежую платформу, но и это не помогло. В настройках расширения галка на РИБ  стоит. На одном из форумов предложили снять с поддержки, но меня такой вариант не устраивает. Удалять расширение тоже не вариант, так как в моих реквизитах уже есть записи.

Отключил расширение и создал начальный образ БД. Развернул на другом ПК и выяснил что расширение перенесено не было. Загрузил его вручную. В оригинальной базе включил расширение и попробовал синхронизировать и тут возникла не предвиденная ситуация - выгрузка зациклилась О_О

А проблема оказалась в том, что ранее зарегистрированные изменения имели номер сообщения много больший, нежели текущие номера. Решается двумя способами:

  1. снимаем регистрацию (ведь они уже выгружены)
  2. изменяем номер исходящего сообщения на номер из регистрации, проводим обмен и ок
Собственно для загрузки данных из расширения придется зарегистрировать измененные данные и отправить на обмен, готово

среда, 4 января 2023 г.

1СЗаготовка ADODB.Connection OLEDB UTF-8

Загружал прайс сварога и получил кривую кодировку. Посмотрел какая кодировка и выснилось, что стоит UTF-8. Сначала решений не было, но вернувшись к вопросу пару месяцев спустя нашел случайно ответ


Функция ПрочитатьCSVвТЗ_ADO(ИмяФайла, Разделитель=";", ЗаголовкиИзПервойСтроки = Ложь)
	ТаблицаРезультат = Новый ТаблицаЗначений;
	Файл = Новый Файл(ИмяФайла);
    
	Connection=Новый COMОбъект("ADODB.Connection");
	Connection.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+Файл.Путь+";Extended Properties=""text;HDR=No;IMEX=1;FMT=Delimited;CharacterSet=65001""");

	Схема = СтрШаблон("[%1]
		|ColNameHeader=%2
		|Format=Delimited(%3)
		|DecimalSymbol=.", Файл.Имя, Формат(ЗаголовкиИзПервойСтроки, "БЛ=False; БИ=True"), Разделитель);
	ФайлСхемы = Новый ТекстовыйДокумент;
	ФайлСхемы.УстановитьТекст(Схема);
	ФайлСхемы.Записать(Файл.Путь + "Schema.ini", "CESU-8"); // UTF-8 без BOM
	
	RecordSet=Новый COMОбъект("ADODB.Recordset");
	RecordSet.ActiveConnection = Connection;
	ЗапросЛист="select * from "+Файл.Имя;
	RecordSet.Open(ЗапросЛист, Connection);
    
	//Здесь читаем файл в ТаблицаРезультат
    
	RecordSet.Close();
	Connection.Close();
	Возврат(ТаблицаРезультат);
КонецФункции

Собственно кодировка указывается в настройке подключения

понедельник, 2 января 2023 г.

1СОшибка РеквизитФормыВЗначение("Объект") Недопустимое значение параметра

 Казалось бы, банальная операция вызов процедуры/функции модуля объекта из модуля формы, но тут я был сбит, как бейсбольной битой, этой ошибкой и засомневался во всем что накопил в голове своей за прошедшие 10 лет периодической возни с 1С.

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

ОбработкаОбъект=РеквизитФормыВЗначение("Объект");
ОбарботкаОбъект.МояПроцедура(ПараметрыПроцедуры);

Но тут я получаю ошибку:

{Обработка.ЗагрузкаПрайсЛиста.Форма.Форма1.Форма(317)}: Ошибка при вызове метода контекста (РеквизитФормыВЗначение)

ОбарботкаОбъект=РеквизитФормыВЗначение("Объект");

по причине:

Недопустимое значение параметра (параметр номер '1')

Недопустимое значение параметра (параметр номер '1')

И думаю что за дичь такая, еще удивляюсь почему в подсказке не было варианта "Объект", в итоге это и был ответ, у объекта на форме не определен был тип:



суббота, 12 ноября 2022 г.

1СОшибка -2147221164(0x80040154): Класс не зарегистрирован

 Частая ошибка, решаемая банальной регистрацией comcntr.dll, но оказывается есть частные случаи, именно с таким я и столкнулся. Имеется сервер 2019, разработчик под учеткой с правами обычного пользователя получил такую ошибку. Что было предпринято:

  1. первое решение
    1. регистрация библиотеки требуемой версии платформы
  2. второе решение
    1. удалена регистрация библиотек других платформ (regsvr32.exe -u)
    2. зарегистрирована еще раз нужная
  3. третье решение
    1. удалены все платформы
    2. установлена требуемая по новой
    3. зарегистрирована библиотека
    4. перезагружен сервер

среда, 26 октября 2022 г.

1СЗаготовка Чтение CSV (ТонкийКлиент,ВебКлиент)

 Понадобилось использовать обработку на опубликованной базе и тут начались проблемы:

  1. Классический выбор файла здесь не работает
  2. Прочитать файл просто так не получилось
  3. Пришлось отказаться от чтения при помощи Excel (типа универсальная была)
Поэтому пришлось использовать БСП, сохранять во временный файл и читать оттуда:


&НаКлиенте
Процедура ИмяФайлаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    ПараметрыЗагрузки = ФайловаяСистемаКлиент.ПараметрыЗагрузкиФайла();
    ПараметрыЗагрузки.ИдентификаторФормы = УникальныйИдентификатор;
    
	ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
	ДиалогВыбораФайла.Фильтр = "Excel CSV (*.csv)|*.csv"; 
	ДиалогВыбораФайла.МножественныйВыбор=Ложь;
	ДиалогВыбораФайла.Заголовок = "Выберите файл";
	ДиалогВыбораФайла.ПредварительныйПросмотр = Истина;
	ДиалогВыбораФайла.ИндексФильтра = 0;
    
    ПараметрыЗагрузки.Диалог = ДиалогВыбораФайла;
    
    ОповещениеЗавершенияВыбораФайла = Новый ОписаниеОповещения("ВыборФАйлаЗавершение", ЭтотОбъект);
    
    ФайловаяСистемаКлиент.ЗагрузитьФайлы(ОповещениеЗавершенияВыбораФайла, ПараметрыЗагрузки); //БСП
КонецПроцедуры
&НаКлиенте
Процедура ВыборФАйлаЗавершение(Результат, ДополнительныеПараметры) Экспорт 
	Если Результат<>Неопределено Тогда
		ИмяФайла=Результат[0].ПолноеИмя;
		АдресВХранилище=Результат[0].Хранение;
		ПрочитатьФайлCSV(АдресВХранилище);
		Элементы.Таблица.Обновить();
		ДоступностьКнопкиСоздания();
	КонецЕсли;
КонецПроцедуры

&НаСервере
Процедура ПрочитатьФайлCSV(АдресВХранилище)
	Данные = ПолучитьИзВременногоХранилища(АдресВХранилище);
	ИмяПромежуточногоФайла = ПолучитьИмяВременногоФайла("csv");
	Данные.Записать(ИмяПромежуточногоФайла);
	УдалитьИзВременногоХранилища(АдресВХранилище);	//очищаем временное хранилище
	
	оТаблица=Новый ТаблицаЗначений;	
	//очищаем таблицу и удаляем колонки
	Таблица.Очистить();
	оТаблица=Таблица.Выгрузить();
	
	Разделитель=";";
	ЗаголовкиИзПервойСтроки=Истина;
	
	Текст = Новый ЧтениеТекста(ИмяПромежуточногоФайла);
	
	 //создадим колонки
	ТекСтрока = Текст.ПрочитатьСтроку();
	Если ТекСтрока <> Неопределено Тогда
		МассивЗначений = СтрРазделить(ТекСтрока, Разделитель);
		ИндексКолонки = 0;
		Для Каждого ИмяКолонки Из МассивЗначений Цикл
			ИмяКолонки = ?(ЗаголовкиИзПервойСтроки, "Кол"+ИндексКолонки, ИмяКолонки);
			оТаблица.Колонки.Добавить(ИмяКолонки);
			ИндексКолонки = ИндексКолонки + 1;
		КонецЦикла;
		Если ЗаголовкиИзПервойСтроки Тогда
			ТекСтрока = Текст.ПрочитатьСтроку();
		КонецЕсли;
	КонецЕсли;

	Пока ТекСтрока <> Неопределено Цикл // строки читаются до символа перевода строки
		НоваяСтрока = оТаблица.Добавить();
		
		МассивЗначений = СтрРазделить(ТекСтрока, Разделитель);
		ИндексКолонки = 0;
		Для Каждого ТекЗначение Из МассивЗначений Цикл
			Попытка
				ЗначениеЯчейки=Дата(ТекЗначение+":00");
			Исключение
				ЗначениеЯчейки=Число(СтрЗаменить(ТекЗначение," ",""));
			КонецПопытки;
			НоваяСтрока[ИндексКолонки] = ЗначениеЯчейки;
			ИндексКолонки = ИндексКолонки + 1;
		КонецЦикла;

		ТекСтрока = Текст.ПрочитатьСтроку();
	КонецЦикла;
		
	//Возврат Результат;
	
	Таблица.Загрузить(оТаблица);
	
	//удаляем временный файл
	Попытка
		УдалитьФайлы(ИмяПромежуточногоФайла);
	Исключение
	   ЗаписьЖурналаРегистрации(НСтр("ru = 'Мой механизм.Действие'"), УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
	КонецПопытки;
КонецПроцедуры