После добавления нового ЛПУ с кодом ЛПУ, который уже есть у какого-то другого ЛПУ в базе данных и если у этого ЛПУ есть настройки (запись в LPU_SETTINGS), то при попытке перезапуска службы она уже не запустится и в системном логе событий появится ошибка:

Ошибка старта службы. Error: Host can't invoke Start method
System.Exception: Ошибка загрузки холдера: LpuSettingsHolder, Stopped. ---> System.Exception: Добавление дублирующего ключа для холдера 5586e4e399fd41f39205071d6e04717f.d828adbcfe2e45809930537f295aecaa, ключ: 6528
   в 4078d44118e74847987677923dc82078.458cea823e4643e78b971c99308aa2cc`2.82dae2784f6b47d19a37f69daa51b5e8(1bee916d99c64ec48998ce3890efffc5 , 1bee916d99c64ec48998ce3890efffc5 , 09f45c58359e4d52afd49bd1a16d71c8 )
   в 4078d44118e74847987677923dc82078.458cea823e4643e78b971c99308aa2cc`2.5d44d4c912064f7f874013760d0dcca7()
   в 901dcc8a300f4b87925979f732b1c213.bc34964987eb4568a46468085abd0e56.5d44d4c912064f7f874013760d0dcca7()
   в 3bfc40a4e3734b228714a82efc48c204.9025335bb3894bd8afea7dff63c35be2.65363d0d4eae4fb7a9fe382b9332f016()
   --- Конец трассировки внутреннего стека исключений ---
   в 3bfc40a4e3734b228714a82efc48c204.9025335bb3894bd8afea7dff63c35be2.65363d0d4eae4fb7a9fe382b9332f016()
   в 8254f6df12fe427d95519bd430e3dc8f.b9bf6490011d4731bc8a49da6fed4f70.112d3fba43134a6c8a34419651829ecd(9025335bb3894bd8afea7dff63c35be2 , Dictionary`2 )
   в 8254f6df12fe427d95519bd430e3dc8f.b9bf6490011d4731bc8a49da6fed4f70.1ab322adf6a54d35bee216e0fe4f3d74()
   в ServerApp._App.Start()
   в ServerApp.Service.OnStart(String[] args)

Решением проблемы будет, только исправление этого кода напрямую в БД.

К счастью, можно эту проблему предусмотреть и не допустить. В программе «Витакарта» есть возможность добавить своеобразный триггер (действия при изменении объектов), который будет срабатывать каждый раз при изменении, добавлении или удалении объекта сущности. Этот триггер в свою очередь будет запускать хранимую процедуру, которая будет проверять есть ли в базе данных уже  ЛПУ с таким кодом и если ЛПУ с таким кодом есть, то пользователю отобразится ошибка и запись в базу данных произведена не будет.

Скрипт для добавления хранимой процедуры с именем spx_ExistLPUWithThisCode в БД AKUZDB:

USE [AKUZDB]
GO
/****** Object:  StoredProcedure [dbo].[spx_ExistLPUWithThisCode]    Script Date: 03.02.2018 19:33:03 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Description:	Запрет ввода ЛПУ с одинаковым кодом (если это ЛПУ есть в LPU_SETTINGS).
-- =============================================
CREATE PROCEDURE [dbo].[spx_ExistLPUWithThisCode]
	@Code varchar(6),
	@LpuID uniqueidentifier
	WITH EXECUTE AS CALLER
AS
BEGIN

	if exists 
	(
	 select * from akuz.T_LPU_MAIN lm 
	 where Code = @Code
	 and LpuID <> @LpuID
	 and
		 EXISTS
		 (
		 SELECT * FROM AKUZ.T_LPU_SETTINGS ls
		 WHERE lm.LpuID = ls.LpuMain
		  )
	)
	begin
		declare @errormessage varchar(max) = 'В таблице T_LPU_SETTINGS уже существует ЛПУ с кодом: '+@Code
		raiserror(@errormessage, 16, 10)
	end

END

 

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

Затем сохраняем созданное нами действие при изменении объектов и проверяем. Всё должно работать.