Часто ошибки возникают при обновлении конфигурации, — особенно если обновление «перескакивает» через несколько релизов. Рассмотрим причину появления и как исправить ошибку 1С «Записи регистра сведений стали неуникальными».

Отображение ошибки

Подобная ошибка может иметь два идентичных отображения от системы 1С:

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

Программные требования к регистрам

Мы знаем, что регистр (register, англ.) сведений формируется для хранения в виде записей (строк). Каждая из них характеризуется видами измерений (профилями) и ресурсов.

Измерения характеризуют разрезы (типы), в которых хранятся данные. А ресурсы— непосредственно содержат их значения.

Например, register сведений «Цены товаров» имеет структуру, состоящую из двух видов профилей («Товар», «ВидЦен») и одного ресурса («Цена»):

Структура товаров в 1С

Таким образом, строки регистра в базе данных будут выглядеть так:

Строки регистра в реестре

Кроме того, при создании записи ей присваивается уникальный ключ. Формирование его системой происходит автоматически.

Одинаковыми считаются такие записи, ключи которых идентичны.

Изменение структуры

Рассмотрим другой пример.

В одно время разработчиком был создан регистр «ОтветственныеЛицаПоСкладам» структурно состоящий из двух измерений («Склад» и «Помещение») и одного ресурса («Ответственный»).

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

И теперь обновлённый register имеет только единственный профиль и ресурс:

Структура его изменилась. Но строки остались!

И в них указано, что для профиля «Помещение» — есть ответственные (ресурсы). Но что с ними делать при переходе на новый релиз — сама программа без пользователя такую задачу не решит.

Поэтому появляется ошибка 1С:«записи регистра сведений стали неуникальными». Может быть такая — имеются записи с одинаковыми измерениями.

Ручное исправление

Смысл этих сообщений сводится к тому, что новая структура содержит несколько строк с лишними измерениями и их нужно свернуть в одну:

Несколько записей с одним значением

В этом случае нужно удалить те, которые соответствуют теперь уже ненужным профилям.

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

Пропущенный релиз

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

Метод сравнения

Тяжелее ситуация складывается, когда обновление происходит с пропуском нескольких релизов. Или предыдущая конфигурация была доработанной. Здесь также возникает необходимость свёртывания строчек. Но сложность состоит в поиске утерянных измерений и реквизитов.

Для решения такой задачи нужно войти в режим «Конфигурация» и выполнить команду «Сравнить конфигурации»:

После этого удалить найденные с помощью консоли запросов неуникальные строчки.

При небольшом их количестве это несложно сделать вручную.

Автоудаление 1

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

Программное удаление дублей

  • Сначала скачать и открыть обработку;
  • Открыть register сведений с неуникальными строчками;
  • Отметить те из измерений, которые нужно удалить в результате обновления;
  • Дать команду нажатием «Свернуть дубли».

Дубли строк будут найдены обработкой и свёрнуты в одну.

После проведения обработки обновление конфигурации будет проведено корректно.

Также можно использовать обработку для проверки наличие дублей без изменения данных (для тестирования или проверки):

Проверка на наличие дублей

Автоудаление 2

Другая обработка для той же цели предложена другим специалистом в этой области — Павлом Чистовым (для мобильного варианта не поддерживается).

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

Комментируйте наши публикации. Описывайте свой опыт в решении проблемных вопросов.

Собственно БезопасноеХранилищеДанных — это регистр сведений, входящий в БСП и предназначенный для "записи конфиденциальных данных в безопасное хранилище, например, паролей для доступа к сторонним системам и т.п.". Что было не совсем очевидно из сообщения при реструктуризации данных, хотя, может, я и невнимательно прочитал 🙂 Его "безопасность" — это отдельный вопрос. 🙂 А природа ошибки в том, что у единственного измерения Владелец исключен тип строка и записи с владельцем — строкой становятся неуникальными.

Необходимо удалить эти записи из регистра. НО т.к. хранилище "безопасное", то форма списка открывается пустой, и пользователь удалить их не может. Консоль запросов прекрасно выводит все записи, убеждаемся в дублях и пишем небольшую обработочку для удаления записей с владельцем строкой. Обработка во вложении.

Всё актуально и для Бухгалтерии 3.0, и УТ 11, и для других конфигураций на БСП.

Михаил Сайко

Двоичные данные платформы 1С:Предприятие – это универсальный объект встроенного языка программирования для работы с файлами. Благодаря объекту ДвоичныеДанные можно любой файл представить в виде последовательности байт. Объект доступен в тонком клиенте, веб-клиенте, мобильном клиенте, на сервере, толстом клиенте, внешнем соединении, мобильном приложении (клиент/сервер).

Объект сериализуется

Данный объект может быть сериализован в/из XML, может использоваться в реквизитах управляемой формы, а также он может быть сериализован в/из XDTO. Тип XDTO, соответствующий данному объекту, определяется в пространстве имен . Имя типа XDTO может быть любым из перечисленных: base64Binary, hexBinary.

Благодаря тому, что двоичные данные доступны и на клиенте, и на сервере, мы можем смело передавать файл в виде двоичных данных с клиента на сервер, однако рекомендованный «шаблон» для передачи файла – использовать хранилище значений.

Задачи, для решения которых можно использовать двоичные данные:

  • Хранение файлов в базе данных (с использованием ХранилищеЗначения);
  • Передача файла с клиента на сервер;
  • Передача файлов при работе с протоколом HTTP;
  • Передача вложений при работе с электронными письмами;
  • Криптография;
  • Представления файла в виде текста (с использованием Base64).

Работа с двоичными данными:

Данный пример кода показывает, как прочитать двоичные данные и передать их с клиента на сервер, используя объект ДвоичныеДанные.

Примеры по работе с двоичными данными

Самый очевидный пример, где применяются двоичные данные, – сохранение файла в базе данных. Для хранения файла в виде двоичных данных необходимо в объекте добавить реквизит с типом «ХранилищеЗначений». Далее представлен пример кода по работе с реквизитом (заполнение значения и получение значения).

Заполнение:

Получение (фрагмент кода, выполняемый на сервере):

Рассмотрим еще один пример: скачивание картинки из интернета и отображение ее на управляемой форме. Для этого также добавляем реквизит с типом ХранилищеЗначения, в котором будет помещаться картинка в двоичном формате.

Функция, скачивающая картинку из интернета:

Использование функции:

Теперь у нас в реквизите «Аватар» лежат двоичные данные картинки. Чтобы картинку вывести на управляемую форму, необходимо добавить реквизит формы «Тип строка», перекинуть его на форму (drag-and-drop), либо создать самостоятельно элемент формы, указав в поле «Путь к данным» наш реквизит «Картинка», после чего изменить вид на «Поле картинки».


По событию ПриСозданииНаСервере

Готово, на форме у нас картинка.

Двоичные данные и потоки

Говоря о двоичных данных, стоит упомянуть о возможности работы с потоками. Она появилась относительно недавно, а именно в версии 8.3.9. Чтобы потоком можно было читать из двоичных данных, применяется метод ОткрытьПотокДляЧтения. Допустим, у нас в базе данных лежит заархивированный xml-файл (как хранить файлы в базе данных рассматривалось ранее). Нам нужно вывести пользователю содержимое этого файла, или у вас настроен какой-то обмен, и вы передаете файлы в заархивированном виде (для экономии трафика).

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

  • Получить двоичные данные из базы;
  • Записать их во временный файл;
  • Разархивировать;
  • Удалить временный файл;
  • Прочитать разархивированный файл.

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

  • Получить двоичные данные из базы;
  • Открыть поток для чтения;
  • Разархивировать;
  • Прочитать разархивированный файл.

Пример кода без использования потоков:

Пример кода по работе с потоком:

Если диск у вас на SSD, рекомендую использовать потоки не только в примере с архивацией, а везде, где это возможно. Да, в данном примере все же происходит запись на диск (разархивация), но будем надеяться, когда-нибудь 1С реализует метод двоичных данных ОткрытьПотокДляЗаписи.

Работа с Base64

Base64 – это стандарт, позволяющий кодировать двоичные данные в виде строки (для кодирования используется 64 символа таблицы ASCII, отсюда и название). Тип ДвоичныеДанные сериализуем, то есть его можно представить в виде XML, для этого применяется объект встроенного языка СериализаторXDTO. После сериализации данные представлены одним узлом base64Binary, содержимое которого есть последовательность байт, закодированная в формате Base64.

строка в Base64

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

Они преобразуются в Base64 и обратно в двоичные данные.

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