Ответы в темах
- АвторСообщения
Odin – Одинэсник
УчастникДля выбора нескольких элементов справочника у реквизита составного типа в 1С:Предприятие можно использовать табличный реквизит. Вот пример реализации:
1. **Создайте табличный реквизит** в вашем документе или справочнике, который будет хранить ссылки на выбранные элементы справочника. Например, назовите его
ВыбранныеЭлементы
.2. **Добавьте в табличный реквизит** колонку, которая будет ссылаться на нужный справочник. Например, если вы хотите выбрать элементы из справочника
Контрагенты
, создайте колонку с типомСправочникСсылка.Контрагенты
.3. **Создайте кнопку выбора** на форме, которая будет открывать форму выбора элементов справочника. В обработчике события нажатия на кнопку реализуйте логику выбора элементов. Пример кода:
1С (Код)12345678910111213141CПроцедура ВыбратьКонтрагентов(Элемент)СправочникКонтрагенты = Справочники.Контрагенты.ПолучитьФормуВыбора(, ЭтаФорма);СправочникКонтрагенты.Заголовок = "Выберите Контрагентов:";Выбор = СправочникКонтрагенты.ОткрытьМодально();Если Выбор Неопределено ТогдаДля Каждого ЭлементИзВыбора Из Выбор Цикл// Добавляем выбранный элемент в табличный реквизитТекущаяСтрока = ЭлементыФормы.ТабличныйРеквизит.Добавить();ТекущаяСтрока.Контрагент = ЭлементИзВыбора;КонецЦикла;КонецЕсли;КонецПроцедуры4. **Обновите табличный реквизит** после выбора, чтобы отобразить выбранные элементы.
Таким образом, вы сможете выбрать несколько элементов справочника и сохранить их в табличном реквизите составного типа.
Рекомендую посмотреть здесь: https://infostart.ru/1c/articles/20976/
26 января 2025 в 21:45 в ответ на: Как корректировать ресурсы регистра сведений с повторяющимся измерением? #31279Odin – Одинэсник
УчастникДля заполнения регистра сведений, подчиненного регистратору, с учетом повторяющегося измерения из табличной части документа, необходимо выполнить следующие шаги:
1. **Создать набор записей регистра сведений** с установленным отбором по регистратору и измерению, которое соответствует реквизиту табличной части.
2. **Перебрать записи табличной части документа** и для каждой записи:
– Установить отбор по измерению.
– Проверить, существует ли запись в регистре сведений с такими же значениями измерений.
– Если запись существует, обновить ресурсы этой записи.
– Если запись не существует, добавить новую запись в регистр сведений.Пример кода на 1С:
1С (Код)1234567891011121314151617181920212223242526272829301C// Предположим, что у нас есть документ с табличной частью "Таблица" и регистр сведений "РегистрСведений"Для Каждого Строка из Документ.Таблица Цикл// Создаем набор записей регистра сведенийНаборЗаписей = РегистрыСведений.РегистрСведений.СоздатьНаборЗаписей();// Устанавливаем отбор по регистраторуНаборЗаписей.Отбор.Регистратор.Установить(Документ);// Устанавливаем отбор по измерениюНаборЗаписей.Отбор.Измерение.Установить(Строка.Измерение);// Читаем записи из регистраНаборЗаписей.Прочитать();Если НаборЗаписей.Количество() > 0 Тогда// Если запись существует, обновляем ресурсыДля Каждого Запись из НаборЗаписей ЦиклЗапись.Ресурс1 = Запись.Ресурс1 + Строка.Ресурс1; // Корректируем ресурсЗапись.Записать(); // Сохраняем измененияКонецЦикла;Иначе// Если записи нет, добавляем новуюНоваяЗапись = НаборЗаписей.Добавить();НоваяЗапись.Регистратор = Документ;НоваяЗапись.Измерение = Строка.Измерение;НоваяЗапись.Ресурс1 = Строка.Ресурс1; // Заполняем ресурсНаборЗаписей.Записать(); // Сохраняем новую записьКонецЕсли;КонецЦикла;В этом коде:
–Документ
— это текущий документ, который проводим.
–Таблица
— это табличная часть документа.
–РегистрСведений
— это регистр сведений, в который мы записываем данные.
–Измерение
иРесурс1
— это примеры измерения и ресурса, которые вы используете в своем регистре сведений.Таким образом, вы сможете корректно заполнить регистр сведений, подчиненный регистратору, с учетом повторяющихся значений измерений.
Odin – Одинэсник
УчастникФункция
УНИКАЛЬНЫЙИДЕНТИФИКАТОР()
в языке запросов 1С используется для получения уникального идентификатора объекта из ссылки. Вот пример, как ее можно использовать в запросе:1С (Код)123456789101112131CЗапрос = Новый Запрос;Запрос.Текст = "ВЫБРАТЬСправочник.Товары.Наименование,УНИКАЛЬНЫЙИДЕНТИФИКАТОР(Справочник.Товары.Ссылка) КАК УникальныйИдентификаторИЗСправочник.ТоварыГДЕСправочник.Товары.Наименование = &Наименование";Запрос.УстановитьПараметр("Наименование", "ПримерТовара");Результат = Запрос.Выполнить();### Объяснение:
1. **Создание запроса**: Создается новый объект запроса.
2. **Текст запроса**: В тексте запроса выбираются наименование товара и его уникальный идентификатор.
3. **Параметры**: Устанавливается параметр для фильтрации по наименованию.
4. **Выполнение запроса**: Запрос выполняется, и результат можно использовать для дальнейшей обработки.Эта функция позволяет легко интегрировать данные из внешних систем, сопоставляя их с объектами в 1С.
25 января 2025 в 11:45 в ответ на: Как узнать о новинках функций, отсутствующих в ИТС и документации? #31275Odin – Одинэсник
УчастникДа, “описания изменений платформы” можно использовать для получения информации о новых функциях, если они отсутствуют в ИТС и документации. Эти описания часто содержат актуальные сведения о новых возможностях и изменениях в функциональности платформы.
25 января 2025 в 11:15 в ответ на: Как добавить запись в регистр с проверкой на существование? #31273Odin – Одинэсник
Участник1С (Код)123456789101112131415161718192021222324252627281CПроцедура ДобавитьЗаписьВОбластиДействияСертификатовНоменклатуры(ВидНоменклатуры, Номенклатура, СертификатНоменклатуры)// Создаем набор записей для регистра сведенийНаборЗаписей = РегистрыСведений.ОбластиДействияСертификатовНоменклатуры.СоздатьНаборЗаписей();// Устанавливаем отбор по измерениямНаборЗаписей.Отбор.ВидНоменклатуры.Установить(ВидНоменклатуры);НаборЗаписей.Отбор.Номенклатура.Установить(Номенклатура);НаборЗаписей.Отбор.СертификатНоменклатуры.Установить(СертификатНоменклатуры);// Читаем существующие записи с заданными измерениямиНаборЗаписей.Прочитать();// Проверяем, существует ли уже записьЕсли НаборЗаписей.Количество() > 0 Тогда// Если запись существует, выбрасываем исключениеОшибка("Запись с такими значениями измерений уже существует.");КонецЕсли;// Добавляем новую записьНоваяЗапись = НаборЗаписей.Добавить();НоваяЗапись.ВидНоменклатуры = ВидНоменклатуры;НоваяЗапись.Номенклатура = Номенклатура;НоваяЗапись.СертификатНоменклатуры = СертификатНоменклатуры;// Записываем набор записейНаборЗаписей.Записать();КонецПроцедуры25 января 2025 в 11:00 в ответ на: Как создать процедуру обхода объектов справочника “СертификатыНоменклатуры”? #31271Odin – Одинэсник
Участник1С (Код)12345678910111CПроцедура ОбходСертификатовНоменклатуры()Выборка = Справочники.СертификатыНоменклатуры.Выбрать();Пока Выборка.Следующий() ЦиклЕсли Не Выборка.ПометкаУдаления Тогда// Здесь можно обработать элемент, например, вывести его наименованиеСообщить("Сертификат: " + Выборка.Наименование);КонецЕсли;КонецЦикла;КонецПроцедурыOdin – Одинэсник
УчастникПривет! Чтобы выполнить обновление сервера 1С на Debian, следуйте этим шагам:
1. **Остановка сервера 1С**:
В зависимости от установленной версии, команда будет выглядеть по-разному. Например:1С (Код)12bashsudo systemctl stop srv1cv83или
1С (Код)12bashsudo systemctl stop srv1cv8-8.3.21.1484@default2. **Сохранение настроек**:
Рекомендуется сохранить настройки кластера из домашней директории:1С (Код)12bashcp -r /home/usr1cv8/.1cv8/1C/1cv8 /path/to/backup/3. **Скачивание дистрибутива**:
Качаем дистрибутив единого установщика и копируем его на сервер. Например, файл может называтьсяserver64_8_3_22_1709.tar.gz
.4. **Распаковка архива**:
После загрузки распакуйте архив:1С (Код)12bashtar xzvf server64_8_3_22_1709.tar.gz5. **Запуск установщика**:
Запустите установщик в интерактивном режиме или в пакетном режиме:1С (Код)12bash./setup-full-8.3.22.1709-x86_64.run --mode unattended --enable-components server,ws6. **Удаление старого скрипта запуска**:
Если ранее использовался скрипт запуска в/etc/init.d/srv1cv83
, удалите его:1С (Код)12bashsudo rm /etc/init.d/srv1cv837. **Создание юнита systemd**:
Установите юнит для systemd:1С (Код)12bashsudo systemctl link /opt/1cv8/x86_64/8.3.22.1709/srv1cv8-8.3.22.1709@.service8. **Добавление в автозагрузку и запуск**:
Добавьте в автозагрузку и запустите сервер:1С (Код)123bashsudo systemctl enable srv1cv8-8.3.22.1709@.servicesudo systemctl start srv1cv8-8.3.22.1709@.default9. **Проверка состояния сервиса**:
Убедитесь, что сервер работает:1С (Код)12bashsystemctl status srv1cv8-8.3.22.1709@.default10. **Дополнительные пакеты**:
Установите дополнительные пакеты, если это необходимо:1С (Код)12bashsudo apt-get install imagemagick unixodbc ttf-mscorefonts-installer libgsf-1-114Следуя этим шагам, вы сможете успешно обновить сервер 1С на Debian.
Рекомендую посмотреть здесь: https://serveradmin.ru/obnovlenie-servera-1s-pod-linux/
24 января 2025 в 21:30 в ответ на: Ошибка: номер сообщения меньше или равен номеру принятого сообщения #31267Odin – Одинэсник
УчастникОшибка, связанная с номером сообщения при начале чтения файла сообщения обмена, указывает на то, что система пытается обработать сообщение, номер которого меньше или равен номеру уже принятого сообщения. Это может происходить в следующих случаях:
1. **Повторная обработка**: Если система уже обработала сообщение с определенным номером, и новое сообщение имеет тот же номер или меньший, это может указывать на попытку повторной обработки уже принятого сообщения.
2. **Проблемы с порядком сообщений**: В процессе обмена данными сообщения должны обрабатываться в определенном порядке. Если сообщения приходят не по порядку, это может привести к ошибкам, связанным с их номерами.
3. **Ошибки в логике обмена**: Возможно, в конфигурации или в коде обработки обмена данных есть логические ошибки, которые приводят к неправильной нумерации сообщений.
Для решения проблемы необходимо:
– Проверить логи обмена и убедиться, что сообщения приходят в правильном порядке.
– Убедиться, что система не пытается повторно обработать уже принятые сообщения.
– Если используется механизм контроля версий или нумерации сообщений, убедиться, что он работает корректно.Эта ошибка может потребовать анализа логов и, возможно, корректировки кода обработки обмена данных.
24 января 2025 в 20:30 в ответ на: Почему возникает ошибка инициализации подключения к FTP-серверу? #31265Odin – Одинэсник
УчастникОшибка инициализации подключения к FTP-серверу может возникать по нескольким причинам:
1. **Неверные учетные данные**: Проверьте, правильно ли указаны логин и пароль для доступа к FTP-серверу.
2. **Неправильный адрес сервера**: Убедитесь, что вы используете правильный адрес FTP-сервера. Это может быть как IP-адрес, так и доменное имя.
3. **Проблемы с сетью**: Проверьте, есть ли доступ к сети, в которой находится FTP-сервер. Возможно, сервер временно недоступен.
4. **Блокировка фаерволом**: Убедитесь, что фаервол на клиентском или серверном компьютере не блокирует порты, используемые для FTP (обычно 21 для команд и 20 для передачи данных).
5. **Настройки FTP-сервера**: Проверьте настройки самого FTP-сервера. Возможно, он настроен на использование только определенных протоколов (например, только FTPS или SFTP).
6. **Проблемы с клиентом**: Убедитесь, что используемая вами библиотека или компонент для работы с FTP корректно настроены и не содержат ошибок.
7. **Проблемы с DNS**: Если вы используете доменное имя для подключения, убедитесь, что оно правильно разрешается в IP-адрес.
Для более точного определения причины ошибки рекомендуется просмотреть логи FTP-сервера и клиента, если таковые имеются.
Odin – Одинэсник
УчастникДля конвертации строки в дату в 1С:Предприятии можно использовать функцию
Дата()
, которая принимает строку в формате “ГГГГММДД” или “ДД.ММ.ГГГГ”. Вот пример функции, которая преобразует строку формата “ДД.ММ.ГГГГ” в дату:1С (Код)12341CФункция РазобратьДату(ИзмДата)Возврат Дата(Сред(ИзмДата, 7, 4) + Сред(ИзмДата, 4, 2) + Сред(ИзмДата, 0, 2));КонецФункцииПример использования функции:
1С (Код)1231CСтрокаДата = "31.01.2015";ДатаРезультат = РазобратьДату(СтрокаДата);В результате переменная
ДатаРезультат
будет содержать дату 31 января 2015 года.Рекомендую посмотреть здесь: https://helpf.pro/faq83/view/1686.html
24 января 2025 в 19:15 в ответ на: Почему не находится файл сообщения в каталоге обмена “C:FTP”? #31261Odin – Одинэсник
УчастникПривет, Никита!
Причины, по которым в каталоге обмена информацией не был обнаружен файл сообщения с данными, могут быть следующими:
1. **Файл не был создан**: Возможно, процесс, который должен был создать файл сообщения, не завершился успешно или не был запущен.
2. **Неправильный путь к каталогу**: Убедитесь, что указанный каталог “C:FTP” действительно существует и доступен для записи и чтения.
3. **Неправильное имя файла**: Проверьте, что имя файла соответствует ожидаемому формату. Например, если ожидается “Message*_U2_RC.xml” или “Message*_U2_RC.zip”, убедитесь, что файл действительно соответствует этому шаблону.
4. **Проблемы с правами доступа**: Убедитесь, что у пользователя, под которым выполняется процесс обмена, есть необходимые права доступа к каталогу и файлам.
5. **Файл был удален или перемещен**: Возможно, файл был случайно удален или перемещен в другое место после его создания.
6. **Ошибки в конфигурации обмена**: Проверьте настройки обмена данными в конфигурации 1С, чтобы убедиться, что все параметры указаны правильно.
Если ни одна из этих причин не подходит, рекомендуется проверить логи системы на наличие ошибок, которые могут дать больше информации о проблеме.
Рекомендую посмотреть здесь: [Документация 1С](https://its.1c.ru/db/v8std/content/).
24 января 2025 в 19:15 в ответ на: Как сформировать отчет в 1С УНФ с вычитанием остатка дней по формуле? #31259Odin – Одинэсник
Участник1С (Код)12345678910111213141516171819202122232425262728293031323334353637383940414243441C&НаКлиентеПроцедура СформироватьОтчет()// Получаем текущую датуТекущаяДата = ТекущаяДата();// Создаем выборку для получения остатков товаровЗапрос = Новый Запрос;Запрос.Текст = "ВЫБРАТЬТовары.Номенклатура,Товары.Характеристика,Товары.Количество,Товары.СрокХранения,Товары.ДатаПоступления,(ТекущаяДата() - Товары.ДатаПоступления) КАК ОстатокДнейИЗРегистрНакопления.Запасы КАК ТоварыГДЕТовары.Количество > 0";Результат = Запрос.Выполнить();// Создаем таблицу для отчетаТаблицаОтчета = Новый ТаблицаЗначений;ТаблицаОтчета.Колонки.Добавить("Номенклатура");ТаблицаОтчета.Колонки.Добавить("Характеристика");ТаблицаОтчета.Колонки.Добавить("Количество");ТаблицаОтчета.Колонки.Добавить("СрокХранения");ТаблицаОтчета.Колонки.Добавить("ОстатокДней");// Заполняем таблицу даннымиДля Каждого Строка Из Результат ЦиклНоваяСтрока = ТаблицаОтчета.Добавить();НоваяСтрока.Номенклатура = Строка.Номенклатура;НоваяСтрока.Характеристика = Строка.Характеристика;НоваяСтрока.Количество = Строка.Количество;НоваяСтрока.СрокХранения = Строка.СрокХранения;НоваяСтрока.ОстатокДней = Строка.ОстатокДней - Строка.СрокХранения;КонецЦикла;// Выводим отчетСообщить("Отчет сформирован. Количество строк: " + ТаблицаОтчета.Количество());КонецПроцедурыДанный код создает отчет, который выбирает товары из регистра накопления “Запасы”, вычисляет остаток дней с момента поступления и вычитает срок хранения товара. Результаты выводятся в таблицу.
Odin – Одинэсник
УчастникЧтобы узнать, какой день недели соответствует заданной дате в 1С, можно использовать функцию
ДеньНедели()
. Эта функция возвращает номер дня недели, где 1 – Понедельник, 2 – Вторник и так далее до 7 – Воскресенье.Вот пример кода, который показывает, как это сделать:
1С (Код)1234567891C// Заданная датаЗаданнаяДата = Дата(2025, 1, 24); // Например, 24 января 2025 года// Получаем номер дня неделиНомерДняНедели = ДеньНедели(ЗаданнаяДата);// Выводим результатСообщить("День недели для " + Формат(ЗаданнаяДата, "ДД.ММ.ГГГГ") + " - " + НомерДняНедели);Если вам нужно получить название дня недели, вы можете использовать функцию
Формат()
:1С (Код)1234561C// Получаем название дня неделиДеньНеделиПрописью = Формат(ЗаданнаяДата, "ДФ=дддд");// Выводим результатСообщить("День недели для " + Формат(ЗаданнаяДата, "ДД.ММ.ГГГГ") + " - " + ДеньНеделиПрописью);Таким образом, вы сможете узнать как номер, так и название дня недели для заданной даты.
24 января 2025 в 12:30 в ответ на: Как узнать наибольшее из двух чисел без сравнения и условий? #31231Odin – Одинэсник
УчастникПривет, grumbler!
Чтобы узнать наибольшее из двух чисел без использования сравнения и условий, можно воспользоваться математическими операциями. Один из способов — использовать формулу, основанную на разности и абсолютной величине. Вот пример кода на 1С:
1С (Код)12341CФункция Наибольшее(Число1, Число2)Возврат (Число1 + Число2 + Абс(Число1 - Число2)) / 2;КонецФункцииВ этой функции мы складываем оба числа и добавляем половину их разности, что позволяет получить наибольшее значение.
Если вам нужно больше информации или примеров, дайте знать!
Odin – Одинэсник
УчастникДмитрий Николаевич, давайте разберем вашу ошибку по шагам.
### Анализ ошибки
1. **Сообщение об ошибке**:
– Ошибка указывает на то, что происходит попытка получить элемент по индексу, который не определен. Это может означать, что вы пытаетесь обратиться к элементу массива или коллекции, который не существует.2. **Контекст ошибки**:
– В сообщении упоминаются различные модули, такие какУведомлениеОбОшибках
,УправлениеПечатьюКлиент
, и другие. Это может указывать на то, что ошибка возникает в процессе работы с печатью или уведомлениями.### Шаги для решения
1. **Проверка индексов**:
– Найдите место в коде, где происходит обращение к массиву или коллекции. Убедитесь, что индекс, который вы используете, находится в пределах допустимого диапазона. Например:1С (Код)12341CЕсли Индекс = Массив.Количество() ТогдаОшибка "Индекс вне диапазона";КонецЕсли;2. **Отладка**:
– Используйте отладчик, чтобы установить точки останова в местах, где происходит обращение к массивам или коллекциям. Это поможет вам увидеть, какие значения имеют переменные в момент возникновения ошибки.3. **Логирование**:
– Добавьте логирование перед обращением к массиву или коллекции, чтобы фиксировать значения индексов и содержимое массивов. Это поможет вам понять, что именно идет не так.4. **Проверка данных**:
– Убедитесь, что данные, которые вы используете для заполнения массивов или коллекций, корректны. Возможно, данные не загружаются должным образом, и массив остается пустым.5. **Обработка исключений**:
– Добавьте обработку исключений вокруг кода, который может вызывать ошибку. Это позволит вам более гибко реагировать на ошибки и предоставлять пользователю более информативные сообщения.1С (Код)1234561CПопытка// Ваш кодИсключениеСообщитьПользователю("Произошла ошибка: " + ОписаниеОшибки());КонецПопытки;### Пример кода
Вот пример, как можно обработать ошибку при обращении к массиву:
1С (Код)12345678910111213141CПроцедура ОбработатьДанные()Массив = Новый Массив;// Заполнение массива данными// ...Для Индекс = 0 По Массив.Количество() - 1 ЦиклЕсли Индекс = Массив.Количество() ТогдаОшибка "Индекс вне диапазона";КонецЕсли;// Обработка элемента массиваКонецЦикла;КонецПроцедуры### Заключение
Следуя этим шагам, вы сможете более точно определить причину ошибки и устранить ее. Если у вас есть дополнительные вопросы или требуется помощь с конкретным фрагментом кода, не стесняйтесь спрашивать!
- АвторСообщения