Ошибка SDBL: Таблица или поле LastUpdate не содержится в поле FROM - причина и решение

20.10.25

База данных - Администрирование СУБД

Публикация размещена исключительно в образовательных целях и подходит только для платформы версии 8.3.24.
Использует недокументированные средства доступа к базе данных 1С. Прямое обращение к СУБД нарушает лицензионное соглашение,
может изменить поведение платформы, привести к разрушению базы данных, скомпрометировать данные,
а также привести к отказу в официальной поддержке Фирмы 1С.
Разбираю причину ошибки "SDBL: Таблица или поле LastUpdate не содержится в поле FROM" и её решение.

Предыстория

Как-то обратились ко мне с этой ошибкой в одной базе УНФ. Не проходило обновление на версию 3.0.9 - при выполнении обработчиков обновления база останавливалась. Тестирование и исправление падало на реструктуризации с этой же ошибкой.

Конфигурация типовая, но с обширными доработками, вынесенными в расширение.

Выяснилось, что ошибка возникла уже в версии 3.0.8, только там обработчики выполнились нормально, но в работе ошибка возникала, и Тестирование тоже не проходило. Возврат к копии до обновления на 3.0.8 можно было рассматривать только в крайнем случае - в базе уже успели поработать.

Удачно, что база была серверная, в PostgreSQL, так удобнее работать непосредственно с базой

ВНИМАНИЕ! 1С не одобряет работу с базами 1С напрямую без использования платформы. Не следует обращаться к данным базы напрямую в рабочем режиме.

 

Расследование

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

Выяснилось, что произошла накладка со структурой базы данных. Ошибки SDBL - ошибки структуры базы. Планы обмена хранятся в таблицах _Node*, и начиная с уровня совместимости платформы 8.3.22 в эти таблицы добавляется служебное поле LastUpdate.

УНФ версии 3.0.7 использует уровень совместимости платформы 8.3.21, а 3.0.8 - уже 8.3.24.

Проблема была в том что в базе было большое расширение со своим планом обмена, и в его таблицу это поле не было добавлено. Не могу сказать что привело к такой проблеме - на тестовой пустой базе мне не удалось проблему воспроизвести.

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

 

Немного о внутренностях баз 1С

ВНИМАНИЕ! 1С не одобряет работу с базами 1С напрямую без использования платформы. Не следует обращаться к данным базы напрямую в рабочем режиме.

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

В базе информация о настройках синхронизации хранится в таблицах планов обмена с именами _Node*

Используются служебные поля

_IDRREF - Уникальный идентификатор узла обмена
_Version - служебное поле
_Marked - пометка удаления
_Code - код узла
_Description - наименование узла
_SentNo - номер отправленного сообщения
_receivedno - номер принятого сообщения
_predefinedid - идентификатор предопределенного узла
_LastUpdate - видимо дата последнего изменения узла, добавлено в платформе 8.3.22

_fld* - пользовательские поля плана обмена

Таблицы планов обмена, объявленные или измененные в расширениях, именуются с суффиксом X1, например _Node55X1. Соответствие конкретных номеров таблиц и полей метаданным дерева конфигуратора описывается в таблице Params в записях с именами вида DBNames*. Для конфигурации это "DBNames", для расширений - "DBNames-Ext-*"

Также в базе хранится описание физической структуры базы, т.е. имена таблиц, полей с типами и ограничениями, индексов.  В таблице DBSchema хранится описание структуры основной конфигурации, в SCHEMASTORAGE с SchemaID=0 хранится описание структуры основной конфигурации (повторяет данные из DBSchema), c другими SchemaID - структура объектов, добавленных расширениями.

Посмотреть эти данные можно для файловых баз с помощью Tool_1CD, для серверных - с помощью средств администрирования СУБД, например PGAdmin для PostgreSQL

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

{"Node47566","N",47566,"",
{13,
{"ID",0,
{1,
{"R",0,0,"Node47566",2}
},"",0},
{"Version",0,
{1,
{"V",0,0,"",0}
},"",0},

 

Исправление ошибки

Внимание! Все манипуляции в базе с изменениями стоит делать при остановленном сервере 1С. В крайнем случае - заблокировать начало сеансов и регламентные, удалить все сеансы. После изменений если сервер 1С не останавливали желательно базу передобавить или изменить параметры базы или сервера на левые и потом вернуть обратно. Делается это чтобы в сервере 1С не осталось закешированных неактуальных данных.

Первое и очевидное - добавить недостающее поле. В PostgreSQL это можно сделать запросом:

ALTER TABLE public._node47566x1 ADD COLUMN _lastupdate timestamp without time zone NOT NULL DEFAULT now()

Тут _node47566x1 - это имя той самой проблемной таблицы. Выяснить его можно или просматривая все таблицы базы вида _nodeNNNx1, или по имени предварительно получив структуру базы в 1С функцией ПолучитьСтруктуруХраненияБазыДанных() или любой из многочисленных обработок.

Для MSSQL запрос будет в целом похож, немного доработать напильником, для файловых баз по возможности я бы посоветовал перенести временно базу в PostgreSQL, либо можно поработать Tool_1CD плюс доработать данные напильником.

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

Выгружаю данные в файл. Мне было удобно это сделать небольшим PHP-скриптом вида:

<?php
$db=pg_connect('host=127.0.0.1 user=postgres dbname=onec_tmp_p password=****');
pg_query('set bytea_output to hex');
$pgr=pg_query('SELECT CURRENTSCHEMA FROM SCHEMASTORAGE WHERE SCHEMAID=1');
$r=pg_fetch_array($pgr);
file_put_contents('schemastorage.hex',hex2bin(substr($r[0],2)));
?>

Как альтернатива - выгрузить таблицу через pg_dump в файл и нужное значение преобразовать из HEX.

pg_dump.exe -h 127.0.0.1 -U postgres -t schemastorage onec_tmp_p >schemastorage.txt

В получившемся файле в текстовом редакторе нахожу описание нужной таблицы, начинается примерно так:

{"Node47566","N",47566,"",
{13,
{"ID",0,
{1,
{"R",0,0,"Node47566",2}
},"",0},
{"Version",0,
{1,
{"V",0,0,"",0}

Во второй строке число 13 - количество полей в описании. Проверяю что поля LastUpdate нет и его надо добавить. Редактирую: изменяю 13 на 14 (в вашем случае число может быть другим, просто увеличиваю на единицу), и вставляю описание нового поля, в конец списка или перед описанием любого другого поля (для серверных баз):

{"LastUpdate",0,
{1,
{"T",0,0,"",0}
},"",0},

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

<?php
$db=pg_connect('host=127.0.0.1 user=postgres dbname=onec_tmp_p password=****');
pg_query('set bytea_output to hex');
$st='\\x'.bin2hex(file_get_contents('schemastorage.txt'));
pg_query_params('UPDATE schemastorage SET currentschema=$1 WHERE schemaid=1',[$st]);
?>

Запускаю базу - УРА! Тестирование и исправление с реструктуризацией проходит (реструктуризацию надо сделать обязательно, чтобы 1С подчистила за нами все неаккуратности), база работает, последующее обновление проходит успешно.

Остаётся только пожелать не сталкиваться с такими ошибками и всегда иметь актуальные бекапы.

Вступайте в нашу телеграмм-группу Инфостарт

SDBL LastUpdate починка исправление

Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

См. также

Администрирование СУБД HighLoad оптимизация Разработчик 1С:Предприятие 8 1С:ERP Управление предприятием 2 Россия Бесплатно (free)

Большинство материалов о компрессии в PostgreSQL отвечают на вопрос «во сколько раз удалось уменьшить базу». Мы предлагаем посмотреть на проблему с другой стороны — какой ценой достигается эта экономия? В статье разбираем архитектурные компромиссы различных подходов к компрессии страниц, объясняем, почему при разработке CSM в Tantor Postgres отказались от погони за максимальным коэффициентом сжатия, и показываем результаты нагрузочных испытаний на реальных базах 1С.

01.10.2026    1500    Tantor    6    

18

HighLoad оптимизация Администрирование СУБД Разработчик 1С:Предприятие 8 1С:ERP Управление предприятием 2 Бесплатно (free)

В рамках 18 релиза СУБД Tantor Postgres мы рассказывали об оптимизациях, которые помогают планировщику сделать более точный выбор между Nested Loop и Hash Join. В следующем релизе у нас планируются оптимизации, которые позволят ускорить выполнение как Nested Loop, так и Hash Join. Сегодня мы расскажем об одном из таких методов - фильтре Блума.

31.08.2026    6160    Tantor    3    

18

Администрирование СУБД Системный администратор Разработчик Бесплатно (free)

5,5 тысячи пользователей в единой базе 1С, розница в режиме 24/7 и SLA 99,98% – в таких условиях любая авария быстро превращается в очереди на кассах, потерю денег и давление со стороны бизнеса. Показываем, как выстроить процесс аварийно-восстановительных работ: от первых алертов и базового скрининга системы до подключения команды, проверки гипотез и дебрифа после инцидента. Разбираем, как метрики, дашборды, техжурнал, Zabbix, Prometheus, Grafana, Telegram-боты и скрипты помогают не гадать, а быстро находить причину проблемы. На реальных авариях объясняем, почему «быстро» не должно означать «рискованно», как работа над ошибками снижает панику и почему каждая авария может сделать систему надежнее.

11.08.2026    3453    jul.dolganova    9    

24

Администрирование СУБД 1С 8.3 1С:ERP Управление предприятием 2 Бесплатно (free)

База 1С:ERP размером 646 Гб, полное маскирование за 5 часов - без создания промежуточной незащищенной копии. Разбираем бесплатный pg_anon на сквозном примере с реального продуктива.

27.07.2026    4599    Tantor    16    

17

Рефакторинг и качество кода Обновление 1С Разработчик 1С:Предприятие 8 1С:ERP Управление предприятием 2 Бесплатно (free)

На проекте сложного обновления 1С:ERP 2.4.14.181 до версии 2.5.22.106 нам было нужно уложить обновление в технологическое окно 48 часов (выходные). Исходный замер, с учетом промежуточных релизов 2.5.8.443, 2.5.12.270, 2.5.17.234, 2.5.22.106, показал требуемое время в 659 часов…

07.07.2026    6908    1c-izh    21    

22

Обновление 1С Разработчик 1С 8.3 Россия Бесплатно (free)

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

25.06.2026    2485    178    akeeela    8    

19
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. SerVer1C 1146 21.10.25 15:54 Сейчас в теме
Может, достаточно было выгрузить базу в DT и загрузить её, но уже на платформе 8.3.24 (даже если и выгружалась бы она на 24-й) ?
2. Pasha1st 867 21.10.25 22:03 Сейчас в теме
(1) Перепроверил, ожидаемо не помогло. Выгрузка прошла, загрузка прошла, проблема осталась. Выгрузка сделана достаточно тупо, доверяет созданной схеме. Загружает аналогично. То что схема неполная - выясняется только в процессе работы
3. VictorKa 19 18.05.26 16:39 Сейчас в теме
Спасибо большое, помогло!
Сделал через pgAdmin.
Получаем запросом
SELECT   encode(currentschema, 'escape') AS schema_text
FROM   schemastorage
WHERE   schemaid = 1;

Правим схему и записываем:
UPDATE   schemastorage 
SET   currentschema = decode('ВАШ_ИСПРАВЛЕННЫЙ_ТЕКСТ', 'escape')
WHERE   schemaid = 1;

P.S.: ошибка зарегистрирована 11.03.2026 https://bugboard.1c.ru/?state=prj-plt8gen-er-60030127
4. eradin 12.08.26 23:13 Сейчас в теме
Получилось следующим образом:
1. Создал копию базы
2. Обновил основную конфигурацию копии
3. В расширении копии поднял релиз (в мойм случае с 8.3.14 на 8.3.25)
4. Обновил расширение.
5. В расширении копии удалил план обмена
6. Добавил заново точно такой же план обмена с теми же реквизитами, именем и т.д.
7. Сохранил cf расширения с новым планом обмена.
8. Открыл рабочую базу.
9. Обновил основную конфигурацию на новый релиз
10. Отключил расширение в конфигураторе
11. Запустил основную конфигурацию, запустились обработчики обновления
12. Включил расширение в конфигураторе
13. Сделал сравнение, объединение расширения с сохранённым в п.7 cf из копии
14. Для объединения выбрал только Свойства самой конфигурации расширения, "Режим совместимости" и "Режим совместимости расширения конфигурации", а также в плане обмена выбрал только "Стандартные реквизиты"
15. Обновил БД.
16. Запустил базу, всё работает
17. На всякий случай запустил Тестирование и исправление

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

P.S. Возможно некоторые пункты лишние и их можно исключить.
Для отправки сообщения требуется регистрация/авторизация