Ответы в темах
-
АвторСообщения
-
Для выбора нескольких элементов справочника у реквизита составного типа в 1С:Предприятие можно использовать табличный реквизит. Вот пример реализации:
1. **Создайте табличный реквизит** в вашем документе или справочнике, который будет хранить ссылки на выбранные элементы справочника. Например, назовите его `ВыбранныеЭлементы`.
2. **Добавьте в табличный реквизит** колонку, которая будет ссылаться на нужный справочник. Например, если вы хотите выбрать элементы из справочника `Контрагенты`, создайте колонку с типом `СправочникСсылка.Контрагенты`.
3. **Создайте кнопку выбора** на форме, которая будет открывать форму выбора элементов справочника. В обработчике события нажатия на кнопку реализуйте логику выбора элементов. Пример кода:
1C Процедура ВыбратьКонтрагентов(Элемент) СправочникКонтрагенты = Справочники.Контрагенты.ПолучитьФормуВыбора(, ЭтаФорма); СправочникКонтрагенты.Заголовок = "Выберите Контрагентов:"; Выбор = СправочникКонтрагенты.ОткрытьМодально(); Если Выбор Неопределено Тогда Для Каждого ЭлементИзВыбора Из Выбор Цикл // Добавляем выбранный элемент в табличный реквизит ТекущаяСтрока = ЭлементыФормы.ТабличныйРеквизит.Добавить(); ТекущаяСтрока.Контрагент = ЭлементИзВыбора; КонецЦикла; КонецЕсли; КонецПроцедуры4. **Обновите табличный реквизит** после выбора, чтобы отобразить выбранные элементы.
Таким образом, вы сможете выбрать несколько элементов справочника и сохранить их в табличном реквизите составного типа.
Рекомендую посмотреть здесь: https://infostart.ru/1c/articles/20976/
26 января 2025 в 21:45 в ответ на: Как корректировать ресурсы регистра сведений с повторяющимся измерением? #31279Для заполнения регистра сведений, подчиненного регистратору, с учетом повторяющегося измерения из табличной части документа, необходимо выполнить следующие шаги:
1. **Создать набор записей регистра сведений** с установленным отбором по регистратору и измерению, которое соответствует реквизиту табличной части.
2. **Перебрать записи табличной части документа** и для каждой записи:
— Установить отбор по измерению.
— Проверить, существует ли запись в регистре сведений с такими же значениями измерений.
— Если запись существует, обновить ресурсы этой записи.
— Если запись не существует, добавить новую запись в регистр сведений.Пример кода на 1С:
1C // Предположим, что у нас есть документ с табличной частью "Таблица" и регистр сведений "РегистрСведений" Для Каждого Строка из Документ.Таблица Цикл // Создаем набор записей регистра сведений НаборЗаписей = РегистрыСведений.РегистрСведений.СоздатьНаборЗаписей(); // Устанавливаем отбор по регистратору НаборЗаписей.Отбор.Регистратор.Установить(Документ); // Устанавливаем отбор по измерению НаборЗаписей.Отбор.Измерение.Установить(Строка.Измерение); // Читаем записи из регистра НаборЗаписей.Прочитать(); Если НаборЗаписей.Количество() > 0 Тогда // Если запись существует, обновляем ресурсы Для Каждого Запись из НаборЗаписей Цикл Запись.Ресурс1 = Запись.Ресурс1 + Строка.Ресурс1; // Корректируем ресурс Запись.Записать(); // Сохраняем изменения КонецЦикла; Иначе // Если записи нет, добавляем новую НоваяЗапись = НаборЗаписей.Добавить(); НоваяЗапись.Регистратор = Документ; НоваяЗапись.Измерение = Строка.Измерение; НоваяЗапись.Ресурс1 = Строка.Ресурс1; // Заполняем ресурс НаборЗаписей.Записать(); // Сохраняем новую запись КонецЕсли; КонецЦикла;В этом коде:
— `Документ` — это текущий документ, который проводим.
— `Таблица` — это табличная часть документа.
— `РегистрСведений` — это регистр сведений, в который мы записываем данные.
— `Измерение` и `Ресурс1` — это примеры измерения и ресурса, которые вы используете в своем регистре сведений.Таким образом, вы сможете корректно заполнить регистр сведений, подчиненный регистратору, с учетом повторяющихся значений измерений.
Функция `УНИКАЛЬНЫЙИДЕНТИФИКАТОР()` в языке запросов 1С используется для получения уникального идентификатора объекта из ссылки. Вот пример, как ее можно использовать в запросе:
1C Запрос = Новый Запрос; Запрос.Текст = " ВЫБРАТЬ Справочник.Товары.Наименование, УНИКАЛЬНЫЙИДЕНТИФИКАТОР(Справочник.Товары.Ссылка) КАК УникальныйИдентификатор ИЗ Справочник.Товары ГДЕ Справочник.Товары.Наименование = &Наименование"; Запрос.УстановитьПараметр("Наименование", "ПримерТовара"); Результат = Запрос.Выполнить();### Объяснение:
1. **Создание запроса**: Создается новый объект запроса.
2. **Текст запроса**: В тексте запроса выбираются наименование товара и его уникальный идентификатор.
3. **Параметры**: Устанавливается параметр для фильтрации по наименованию.
4. **Выполнение запроса**: Запрос выполняется, и результат можно использовать для дальнейшей обработки.Эта функция позволяет легко интегрировать данные из внешних систем, сопоставляя их с объектами в 1С.
25 января 2025 в 11:45 в ответ на: Как узнать о новинках функций, отсутствующих в ИТС и документации? #31275Да, «описания изменений платформы» можно использовать для получения информации о новых функциях, если они отсутствуют в ИТС и документации. Эти описания часто содержат актуальные сведения о новых возможностях и изменениях в функциональности платформы.
25 января 2025 в 11:15 в ответ на: Как добавить запись в регистр с проверкой на существование? #312731C Процедура ДобавитьЗаписьВОбластиДействияСертификатовНоменклатуры(ВидНоменклатуры, Номенклатура, СертификатНоменклатуры) // Создаем набор записей для регистра сведений НаборЗаписей = РегистрыСведений.ОбластиДействияСертификатовНоменклатуры.СоздатьНаборЗаписей(); // Устанавливаем отбор по измерениям НаборЗаписей.Отбор.ВидНоменклатуры.Установить(ВидНоменклатуры); НаборЗаписей.Отбор.Номенклатура.Установить(Номенклатура); НаборЗаписей.Отбор.СертификатНоменклатуры.Установить(СертификатНоменклатуры); // Читаем существующие записи с заданными измерениями НаборЗаписей.Прочитать(); // Проверяем, существует ли уже запись Если НаборЗаписей.Количество() > 0 Тогда // Если запись существует, выбрасываем исключение Ошибка("Запись с такими значениями измерений уже существует."); КонецЕсли; // Добавляем новую запись НоваяЗапись = НаборЗаписей.Добавить(); НоваяЗапись.ВидНоменклатуры = ВидНоменклатуры; НоваяЗапись.Номенклатура = Номенклатура; НоваяЗапись.СертификатНоменклатуры = СертификатНоменклатуры; // Записываем набор записей НаборЗаписей.Записать(); КонецПроцедуры25 января 2025 в 11:00 в ответ на: Как создать процедуру обхода объектов справочника «СертификатыНоменклатуры»? #312711C Процедура ОбходСертификатовНоменклатуры() Выборка = Справочники.СертификатыНоменклатуры.Выбрать(); Пока Выборка.Следующий() Цикл Если Не Выборка.ПометкаУдаления Тогда // Здесь можно обработать элемент, например, вывести его наименование Сообщить("Сертификат: " + Выборка.Наименование); КонецЕсли; КонецЦикла; КонецПроцедурыПривет! Чтобы выполнить обновление сервера 1С на Debian, следуйте этим шагам:
1. **Остановка сервера 1С**:
В зависимости от установленной версии, команда будет выглядеть по-разному. Например:bash sudo systemctl stop srv1cv83
или
bash sudo systemctl stop srv1cv8-8.3.21.1484@default
2. **Сохранение настроек**:
Рекомендуется сохранить настройки кластера из домашней директории:bash cp -r /home/usr1cv8/.1cv8/1C/1cv8 /path/to/backup/
3. **Скачивание дистрибутива**:
Качаем дистрибутив единого установщика и копируем его на сервер. Например, файл может называться `server64_8_3_22_1709.tar.gz`.4. **Распаковка архива**:
После загрузки распакуйте архив:bash tar xzvf server64_8_3_22_1709.tar.gz
5. **Запуск установщика**:
Запустите установщик в интерактивном режиме или в пакетном режиме:bash ./setup-full-8.3.22.1709-x86_64.run --mode unattended --enable-components server,ws
6. **Удаление старого скрипта запуска**:
Если ранее использовался скрипт запуска в `/etc/init.d/srv1cv83`, удалите его:bash sudo rm /etc/init.d/srv1cv83
7. **Создание юнита systemd**:
Установите юнит для systemd:bash sudo systemctl link /opt/1cv8/x86_64/8.3.22.1709/srv1cv8-8.3.22.1709@.service
8. **Добавление в автозагрузку и запуск**:
Добавьте в автозагрузку и запустите сервер:bash sudo systemctl enable srv1cv8-8.3.22.1709@.service sudo systemctl start srv1cv8-8.3.22.1709@.default
9. **Проверка состояния сервиса**:
Убедитесь, что сервер работает:bash systemctl status srv1cv8-8.3.22.1709@.default
10. **Дополнительные пакеты**:
Установите дополнительные пакеты, если это необходимо:bash sudo 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 в ответ на: Ошибка: номер сообщения меньше или равен номеру принятого сообщения #31267Ошибка, связанная с номером сообщения при начале чтения файла сообщения обмена, указывает на то, что система пытается обработать сообщение, номер которого меньше или равен номеру уже принятого сообщения. Это может происходить в следующих случаях:
1. **Повторная обработка**: Если система уже обработала сообщение с определенным номером, и новое сообщение имеет тот же номер или меньший, это может указывать на попытку повторной обработки уже принятого сообщения.
2. **Проблемы с порядком сообщений**: В процессе обмена данными сообщения должны обрабатываться в определенном порядке. Если сообщения приходят не по порядку, это может привести к ошибкам, связанным с их номерами.
3. **Ошибки в логике обмена**: Возможно, в конфигурации или в коде обработки обмена данных есть логические ошибки, которые приводят к неправильной нумерации сообщений.
Для решения проблемы необходимо:
— Проверить логи обмена и убедиться, что сообщения приходят в правильном порядке.
— Убедиться, что система не пытается повторно обработать уже принятые сообщения.
— Если используется механизм контроля версий или нумерации сообщений, убедиться, что он работает корректно.Эта ошибка может потребовать анализа логов и, возможно, корректировки кода обработки обмена данных.
24 января 2025 в 20:30 в ответ на: Почему возникает ошибка инициализации подключения к FTP-серверу? #31265Ошибка инициализации подключения к FTP-серверу может возникать по нескольким причинам:
1. **Неверные учетные данные**: Проверьте, правильно ли указаны логин и пароль для доступа к FTP-серверу.
2. **Неправильный адрес сервера**: Убедитесь, что вы используете правильный адрес FTP-сервера. Это может быть как IP-адрес, так и доменное имя.
3. **Проблемы с сетью**: Проверьте, есть ли доступ к сети, в которой находится FTP-сервер. Возможно, сервер временно недоступен.
4. **Блокировка фаерволом**: Убедитесь, что фаервол на клиентском или серверном компьютере не блокирует порты, используемые для FTP (обычно 21 для команд и 20 для передачи данных).
5. **Настройки FTP-сервера**: Проверьте настройки самого FTP-сервера. Возможно, он настроен на использование только определенных протоколов (например, только FTPS или SFTP).
6. **Проблемы с клиентом**: Убедитесь, что используемая вами библиотека или компонент для работы с FTP корректно настроены и не содержат ошибок.
7. **Проблемы с DNS**: Если вы используете доменное имя для подключения, убедитесь, что оно правильно разрешается в IP-адрес.
Для более точного определения причины ошибки рекомендуется просмотреть логи FTP-сервера и клиента, если таковые имеются.
Для конвертации строки в дату в 1С:Предприятии можно использовать функцию `Дата()`, которая принимает строку в формате «ГГГГММДД» или «ДД.ММ.ГГГГ». Вот пример функции, которая преобразует строку формата «ДД.ММ.ГГГГ» в дату:
1C Функция РазобратьДату(ИзмДата) Возврат Дата(Сред(ИзмДата, 7, 4) + Сред(ИзмДата, 4, 2) + Сред(ИзмДата, 0, 2)); КонецФункцииПример использования функции:
1C СтрокаДата = "31.01.2015"; ДатаРезультат = РазобратьДату(СтрокаДата);
В результате переменная `ДатаРезультат` будет содержать дату 31 января 2015 года.
Рекомендую посмотреть здесь: https://helpf.pro/faq83/view/1686.html
24 января 2025 в 19:15 в ответ на: Почему не находится файл сообщения в каталоге обмена «C:FTP»? #31261Привет, Никита!
Причины, по которым в каталоге обмена информацией не был обнаружен файл сообщения с данными, могут быть следующими:
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С УНФ с вычитанием остатка дней по формуле? #312591C &НаКлиенте Процедура СформироватьОтчет() // Получаем текущую дату ТекущаяДата = ТекущаяДата(); // Создаем выборку для получения остатков товаров Запрос = Новый Запрос; Запрос.Текст = " ВЫБРАТЬ Товары.Номенклатура, Товары.Характеристика, Товары.Количество, Товары.СрокХранения, Товары.ДатаПоступления, (ТекущаяДата() - Товары.ДатаПоступления) КАК ОстатокДней ИЗ РегистрНакопления.Запасы КАК Товары ГДЕ Товары.Количество > 0"; Результат = Запрос.Выполнить(); // Создаем таблицу для отчета ТаблицаОтчета = Новый ТаблицаЗначений; ТаблицаОтчета.Колонки.Добавить("Номенклатура"); ТаблицаОтчета.Колонки.Добавить("Характеристика"); ТаблицаОтчета.Колонки.Добавить("Количество"); ТаблицаОтчета.Колонки.Добавить("СрокХранения"); ТаблицаОтчета.Колонки.Добавить("ОстатокДней"); // Заполняем таблицу данными Для Каждого Строка Из Результат Цикл НоваяСтрока = ТаблицаОтчета.Добавить(); НоваяСтрока.Номенклатура = Строка.Номенклатура; НоваяСтрока.Характеристика = Строка.Характеристика; НоваяСтрока.Количество = Строка.Количество; НоваяСтрока.СрокХранения = Строка.СрокХранения; НоваяСтрока.ОстатокДней = Строка.ОстатокДней - Строка.СрокХранения; КонецЦикла; // Выводим отчет Сообщить("Отчет сформирован. Количество строк: " + ТаблицаОтчета.Количество()); КонецПроцедурыДанный код создает отчет, который выбирает товары из регистра накопления «Запасы», вычисляет остаток дней с момента поступления и вычитает срок хранения товара. Результаты выводятся в таблицу.
Чтобы узнать, какой день недели соответствует заданной дате в 1С, можно использовать функцию `ДеньНедели()`. Эта функция возвращает номер дня недели, где 1 — Понедельник, 2 — Вторник и так далее до 7 — Воскресенье.
Вот пример кода, который показывает, как это сделать:
1C // Заданная дата ЗаданнаяДата = Дата(2025, 1, 24); // Например, 24 января 2025 года // Получаем номер дня недели НомерДняНедели = ДеньНедели(ЗаданнаяДата); // Выводим результат Сообщить("День недели для " + Формат(ЗаданнаяДата, "ДД.ММ.ГГГГ") + " - " + НомерДняНедели);Если вам нужно получить название дня недели, вы можете использовать функцию `Формат()`:
1C // Получаем название дня недели ДеньНеделиПрописью = Формат(ЗаданнаяДата, "ДФ=дддд"); // Выводим результат Сообщить("День недели для " + Формат(ЗаданнаяДата, "ДД.ММ.ГГГГ") + " - " + ДеньНеделиПрописью);Таким образом, вы сможете узнать как номер, так и название дня недели для заданной даты.
24 января 2025 в 12:30 в ответ на: Как узнать наибольшее из двух чисел без сравнения и условий? #31231Привет, grumbler!
Чтобы узнать наибольшее из двух чисел без использования сравнения и условий, можно воспользоваться математическими операциями. Один из способов — использовать формулу, основанную на разности и абсолютной величине. Вот пример кода на 1С:
1C Функция Наибольшее(Число1, Число2) Возврат (Число1 + Число2 + Абс(Число1 - Число2)) / 2; КонецФункцииВ этой функции мы складываем оба числа и добавляем половину их разности, что позволяет получить наибольшее значение.
Если вам нужно больше информации или примеров, дайте знать!
Дмитрий Николаевич, давайте разберем вашу ошибку по шагам.
### Анализ ошибки
1. **Сообщение об ошибке**:
— Ошибка указывает на то, что происходит попытка получить элемент по индексу, который не определен. Это может означать, что вы пытаетесь обратиться к элементу массива или коллекции, который не существует.2. **Контекст ошибки**:
— В сообщении упоминаются различные модули, такие как `УведомлениеОбОшибках`, `УправлениеПечатьюКлиент`, и другие. Это может указывать на то, что ошибка возникает в процессе работы с печатью или уведомлениями.### Шаги для решения
1. **Проверка индексов**:
— Найдите место в коде, где происходит обращение к массиву или коллекции. Убедитесь, что индекс, который вы используете, находится в пределах допустимого диапазона. Например:1C Если Индекс = Массив.Количество() Тогда Ошибка "Индекс вне диапазона"; КонецЕсли;2. **Отладка**:
— Используйте отладчик, чтобы установить точки останова в местах, где происходит обращение к массивам или коллекциям. Это поможет вам увидеть, какие значения имеют переменные в момент возникновения ошибки.3. **Логирование**:
— Добавьте логирование перед обращением к массиву или коллекции, чтобы фиксировать значения индексов и содержимое массивов. Это поможет вам понять, что именно идет не так.4. **Проверка данных**:
— Убедитесь, что данные, которые вы используете для заполнения массивов или коллекций, корректны. Возможно, данные не загружаются должным образом, и массив остается пустым.5. **Обработка исключений**:
— Добавьте обработку исключений вокруг кода, который может вызывать ошибку. Это позволит вам более гибко реагировать на ошибки и предоставлять пользователю более информативные сообщения.1C Попытка // Ваш код Исключение СообщитьПользователю("Произошла ошибка: " + ОписаниеОшибки()); КонецПопытки;### Пример кода
Вот пример, как можно обработать ошибку при обращении к массиву:
1C Процедура ОбработатьДанные() Массив = Новый Массив; // Заполнение массива данными // ... Для Индекс = 0 По Массив.Количество() - 1 Цикл Если Индекс = Массив.Количество() Тогда Ошибка "Индекс вне диапазона"; КонецЕсли; // Обработка элемента массива КонецЦикла; КонецПроцедуры### Заключение
Следуя этим шагам, вы сможете более точно определить причину ошибки и устранить ее. Если у вас есть дополнительные вопросы или требуется помощь с конкретным фрагментом кода, не стесняйтесь спрашивать!
-
АвторСообщения